如果我有两个类,一个继承自另一个并且我在两者中都使用相同的方法/属性名,那么无论当前对象是否已被强制转换为基类,如何使该方法调用子类
例如(省略了无关的部分):
public class MyBase {
public int GetNumber() {
return 1;
}
}
public class MyDerived : MyBase {
public new int GetNumber() {
return 20;
}
}
MyDervied someVar = new MyDerived();
int derivedVar = someVar.GetNumber(); // 20
MyBase baseVar = (MyBase)someVar;
int baseVar = baseVar.GetNumber(); // 1
我的直觉是为派生类使用override而不是new,但我得到一个“没有成员被发现覆盖”。
答案 0 :(得分:7)
您的基本方法需要先标记为virtual
,然后才能override
。
public class MyBase {
public virtual int GetNumber() {
return 1;
}
}
public class MyDerived : MyBase {
public override int GetNumber() {
return 20;
}
}
答案 1 :(得分:1)
new
非常有用,但巧合该类已经拥有一个具有相同名称的成员。它用于添加新成员,而不是用于更改现有成员的行为。
class A
{
public void Foo()
{
Console.WriteLine("A.Foo()");
}
}
class B : A
{
public new void Foo()
{
Console.WriteLine("B.Foo()");
}
}
...
A x = new A();
x.Foo(); // prints "A.Foo()"
B y = new B();
y.Foo(); // prints "B.Foo()"
A z = y;
z.Foo(); // prints "A.Foo()", not "B.Foo()"!
注意与被覆盖的方法相比时的行为差异,在后一种情况下会打印"B.Foo()"
。