日期:2014-05-17  浏览次数:20480 次

碰到几次这样的题了,感觉对继承还是没有深入的理解,大侠请进
几道这样的题,分别输出什么结果?并且说明理由,为什么会是这样的结果,全面深入的剖析
1. 
C# code

    public class A
    {
        public void F()
        {
            Console.WriteLine("A.F");
            Console.ReadLine();
        }
        public virtual void G()
        {
            Console.WriteLine("A.G");
            Console.ReadLine();
        }
       
    }
    public class B : A
    {
        new public void F()
        {
            Console.WriteLine("B.F");
            Console.ReadLine();
        }
        public override void G()
        {
            Console.WriteLine("B.G");
            Console.ReadLine();
        }
       
    }
 static void Main(string[] args)
        {
            B b = new B();
            A a = b;
            a.F();
            b.F();
            a.G();
            b.G();
}



第二题:
C# code

 public class A
    {
        public virtual void F()
        {
            Console.WriteLine("A.F");
            Console.ReadLine();
        }
    }
    public class B : A
    {
        public override void F()
        {
            Console.WriteLine("B.F");
            Console.ReadLine();
        }
    }
    public class C : B
    {
        new public virtual void F()
        {
            Console.WriteLine("C.F");
            Console.ReadLine();
        }
    }

    public class D : C
    {
        public override void F()
        {
            Console.WriteLine("D.F");
            Console.ReadLine();
        }
    }

static void Main(string[] args)
        {
            D d = new D();
            A a = d;
            B b = d;
            C c = d;
            a.F();
            b.F();
            c.F();
            d.F();
}



还有一些更复杂的,涉及到接口的了,把一个对象强转为接口类行等等,郁闷了

------解决方案--------------------
C# code

 static void Main(string[] args)
        {
            B b = new B();
            A a = b;
            a.F();
            b.F();
            a.G();
            b.G();
}

------解决方案--------------------
C# code

new 是表示实例化一个对象,而且内存会分配内存给对象
其他的东西都是引用该内存对象

------解决方案--------------------
1.方法定义了virtual,用的时候和正常方法一样,子类继承,没有重写的话,也和平常方法一样
2.子类继承重写之后,如果没用调用base.XXX()就完全按重写后内容
3.子类重写并且调用了base.XXX()就会在相应地方掉父类方法
------解决方案--------------------
探讨

C# code

new 是表示实例化一个对象,而且内存会分配内存给对象
其他的东西都是引用该内存对象