超类和子类对象共享公共方法吗?

时间:2010-10-02 14:08:32

标签: c# oop

如果我没有将方法标记为virtual,它是否可用于派生类?

如果使用对象a,我会对基类的方法进行更改。然后,对象b访问基类的相同方法m1()(可用于派生类)。

它会按对象a打印这些更改的值吗?

他们会分享共同的方法吗?

class A
{
    public int m(int i)
    {
        return i * i;
    }
}

class B : A
{
}

class C
{
    static void Main()
    {
        A a = new A();
        int x = a.m(2);    // returns 4

        B b = new B();
        int y = b.m(4);    // 16
    }
}

2 个答案:

答案 0 :(得分:2)

是的,因为派生类是基类的一种类型。

考虑一个哺乳动物课程。所有的哺乳动物都会呼吸,所以我们会有哺乳动物。呼吸()。现在考虑一个Cat类。由于猫是哺乳动物,我们将其从哺乳动物中获得,然后已经存在从哺乳动物继承的Cat.Breathe(),没有任何额外的工作(“无额外工作”位是OO的一个省时方面)。

如果Mammal.Breathe()是虚拟的,那么我们可以使其在Cat.Breathe()的情况下表现不同。如果它不是虚拟的,我们不能,尽管非虚方法可以调用虚方法,这会使其行为的一部分可以覆盖。

答案 1 :(得分:1)

  

如果我不使用虚拟方法,它是否可用于派生类?

是的,该方法可用于任何派生类,但您无法在派生类中重写此方法并更改其行为。在您的示例类中,B拥有m1方法,因为它派生自类A,但由于该方法不是虚拟的,因此无法覆盖它。

事实上,您的示例甚至不会编译,因为您没有为m1方法指定返回类型。此外,通过不为方法指定access modifier,将假设private,您甚至无法在派生类中调用基本方法(除非使用反射)。 (经过@dtb编辑后,代码现在将编译)