继承和覆盖方法/属性

时间:2009-10-18 16:17:15

标签: c# inheritance

如果我有两个类,一个继承自另一个并且我在两者中都使用相同的方法/属性名,那么无论当前对象是否已被强制转换为基类,如何使该方法调用子类

例如(省略了无关的部分):

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,但我得到一个“没有成员被发现覆盖”。

2 个答案:

答案 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()"

相关问题