using System; public class A { public virtual void F() { Console.WriteLine("A.F()"); } }class B:A { public override void F() { Console.WriteLine("B.F()"); } }class C:A { public new void F() { Console.WriteLine("C.F()"); } }class Test { public static void Main() { B b = new B(); b.F(); C c = new C(); c.F(); A a; a = b; a.F(); a = c; a.F(); } }
//请参看输出结果A a; a = b;//基类的引用指向派生类的对象,调用派生类的方法 a.F(); a = c;//基类的引用指向派生类的对象,调用基类的方法 a.F();
隐藏: 子类重定义父类的方法(函数声明一致),实现重定义只需要加上关键字new; 如果没有添加关键字new,那么编译器将默认添加new; 隐藏的成员是早绑定。 例: class B : A {} //将new一个B的实例,然后把引用传给a, //a只能使用B实例中继承来得方法和字段,即只能使用A中的成员 A a = New B(); a.Fun();//调用A中的Fun覆盖: 实际是就是虚函数,采用晚绑定的方式。 例: class A { public virtual void Fun(){} } class B : A { public new virtual void Fun(){} }//这是隐藏 class C : B { public override void Fun(){} }//这是覆盖 A[] arryA = new A[2];//早绑定,绑定到A arryA[0] = new B(); arryA[1] = new C(); arryA[0].Fun();//将调用A的Fun() arryA[1].Fun();//将调用A的Fun() B[] arryB = new B[2];//晚绑定 arryB[0] = new B();//绑定到B arryB[1] = new C();//绑定到C arryB[0].Fun();//将调用B的Fun() arryB[1].Fun();//将调用C的Fun()
public class A
{
public virtual void F()
{
Console.WriteLine("A.F()");
}
}class B:A
{
public override void F()
{
Console.WriteLine("B.F()");
}
}class C:A
{
public new void F()
{
Console.WriteLine("C.F()");
}
}class Test
{
public static void Main()
{
B b = new B();
b.F(); C c = new C();
c.F(); A a;
a = b;
a.F();
a = c;
a.F();
}
}
a = b;//基类的引用指向派生类的对象,调用派生类的方法
a.F();
a = c;//基类的引用指向派生类的对象,调用基类的方法
a.F();
每个类有一个方法表,每个方法称之为方法槽虚方法重载后
重载的方法重写这个方法槽new
新增方法槽,原有的方法槽保留故有以上的行为
-------------
应该的隐藏
是不是override以后子类就没办法使用父类的方法了?
是不是override以后子类就没办法使用父类的方法了?
子类重定义父类的方法(函数声明一致),实现重定义只需要加上关键字new;
如果没有添加关键字new,那么编译器将默认添加new;
隐藏的成员是早绑定。
例:
class B : A {} //将new一个B的实例,然后把引用传给a,
//a只能使用B实例中继承来得方法和字段,即只能使用A中的成员
A a = New B();
a.Fun();//调用A中的Fun覆盖:
实际是就是虚函数,采用晚绑定的方式。
例:
class A { public virtual void Fun(){} }
class B : A { public new virtual void Fun(){} }//这是隐藏
class C : B { public override void Fun(){} }//这是覆盖
A[] arryA = new A[2];//早绑定,绑定到A
arryA[0] = new B();
arryA[1] = new C();
arryA[0].Fun();//将调用A的Fun()
arryA[1].Fun();//将调用A的Fun() B[] arryB = new B[2];//晚绑定
arryB[0] = new B();//绑定到B
arryB[1] = new C();//绑定到C
arryB[0].Fun();//将调用B的Fun()
arryB[1].Fun();//将调用C的Fun()