c#中子类使用被隐藏的父类方法
在C#中,在子类中可用new修饰一个方法,实现了在子类中隐藏父类方法。但有时我们可能需要通过子类对象使用已被隐藏了的父类方法,这时可通过将子类转换为父类来调用被隐藏了的父类方法,这样,子类对象既也可以使用自身新定义的方法,也可以使用已被隐藏的父类的方法。以下是一个示例.
class Program {
static void Main(string[] args) {
B b = new B();
b.Age = 10;
b.SayMyAge();
((A)b).SayMyAge();
b.SayMyAge();
Console.ReadLine();
}
}
class A {
public int Age { get; set; }
public void SayMyAge ()
{
Console.WriteLine("I am {0} years old.",Age);
}
}
class B : A {
public new void SayMyAge() {
Console.WriteLine("我 {0} 岁了.",Age);
}
}
执行结果如下:
可见,通过(A)b这个命令生成一个匿名对象,该对象是b的浅拷贝副本,仍指向b,且这个匿名副本对象对应的类型为A。所以它执行的是A类的方法。同时,可以看到,(A)b对b对象没有任何影响。
用父类实例化子类(如A c=new B()),或引用对象的类型是父类,而实例是子类(如通过 A c=(A)b),这类情况姑称为“父类子体”。new 的作用有二,一是隐藏父类方法,二是在“父类子体”情况下恢复父类方法。这样对于有用了new 修饰的方法的子类而言,既可用子类的方法,也可用同名的父类方法,这也算是一种方法“双活”吧。
举一个例子,父类中有一个ToString()方法,但不是很好用,在子类中用new 了一个新的ToString()方法,这样子类实体执行ToString()时执行的是子类中的方法,但有时需要这个子类实体执行父类中的ToString()方法,这时就可以用上述方法来实现了。