秋海

博客园 首页 新随笔 联系 订阅 管理

用c#时间不短了,以为基础知识都熟悉了,对设计到具体细节时,就模棱两可的。惭愧!

一、重载
在写个简单的实例,加以巩固。有这样一题:代码如下,编译会出错吗,为什么
class Program
{
  public static int add(int a, int b) { return a + b; }
  public static double add(int a, int b) { return a + b; }   
  publcvoid Main(string[] args)
  {
     add(1, 2);
   }
}
1.重载:方法名相同,但参数列表不同(参数类型,参数个数)。返回值不同构不成重载。所以报错了。
2.Main这种入口一般都为静态的。会提示:不包含适用与入口的静态Main。

二、重写override:改写父类的方法。
代码如下:输出什么?
 public class ClassA
    {
        public virtual void Write()
        {
            Console.WriteLine("ClassA");
        }
    }
    public class ClassB : ClassA
    {
        public override void Write()
        {
            Console.WriteLine("ClassB");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ClassB b = new ClassB();
            b.Write();
            ClassA a1 = new ClassA();
            a1.Write();
            ClassA a2 = b;
            a2.Write();
            Console.ReadKey();
        }
    }
输出:ClassBClassAClassB。在发生继承时,父类和子类的方法都会调用ClassB。发生继承,就是创建的还是ClassB的实例,会把ClassB的实例转成ClassA。
直接创建的ClassA是没有发生继承的,没有发生重写。所以直接创建的ClassA的实例,调用的是ClassA的方法。

三、隐藏new。隐藏父类的方法,但不改变父类的方法
代码如下:输出什么?
    public class ClassA
    {
        public void Write()
        {
            Console.WriteLine("ClassA");
        }
    }
    public class ClassB : ClassA
    {
        public new void Write()
        {
            Console.WriteLine("ClassB");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ClassB b = new ClassB();
            b.Write();
            ClassA a1 = new ClassA();
            a1.Write();
            ClassA a2 = b;
            a2.Write();
            Console.ReadKey();
        }
    }
输出:ClassBClassAClassA。隐藏的时候,ClassA、ClassB的实例就是调用自己的方法。ClassB不设计ClassA的修改。

posted on 2011-02-15 11:13  秋海  阅读(176)  评论(0)    收藏  举报