继承麻烦

时间:2010-04-18 17:26:03

标签: c# oop inheritance

我对编程比较陌生,所以请原谅我,如果我说错了一些术语(我已经学会了这些概念,我实际上并没有真正使用它们)。

麻烦:我目前有一个班级我会叫鲍勃,它的父类是Cody,Cody有方法调用Foo()。我希望Bob也有Foo()方法,除了一些额外的代码行。我试图做Foo():base(),但这似乎不起作用。对此有一些简单的解决方案吗?

3 个答案:

答案 0 :(得分:8)

您可以在派生类中覆盖Foo并使用base.Foo()调用重写的基类实现:

class Cody
{
    public virtual void Foo()
    {
        Console.WriteLine("Cody says: Hello World!");
    }
}

class Bob : Cody
{
    public override void Foo()
    {
        base.Foo();
        Console.WriteLine("Bob says: Hello World!");
        base.Foo();
    }
}

new Bob().Foo()的输出:

Cody says: Hello World!
Bob says: Hello World!
Cody says: Hello World!

构造函数使用稍微不同的语法来调用基类中的构造函数,因为它们要求必须在派生类中的构造函数之前调用基类构造函数:

class Cody
{
    public Cody()
    {
    }
}

class Bob : Cody
{
    public Bob() : base()
    {
    }
}

答案 1 :(得分:2)

标准形式(没有多态性)是:

class Cody
{
    public void Foo () 
    {
    }
}

class Bob : Cody
{
    public new void Foo()
    {
        base.Foo(); // Cody.Foo()
        // extra stuff
    }
}

如果您想要多态,则以下两行会发生变化:

// Cody
 public virtual void Foo () 

// Bob 
public override void Foo()

通过Cody引用调用Bob实例时显示差异:

Bob b = new Bob();
Cody c = b;

b.Foo();    // always Bob.Foo()
c.Foo();    // when virtual, Bob.Foo(), else Cody.Foo()

答案 2 :(得分:0)

您需要将基本方法标记为虚拟,在继承的类中覆盖它,然后以这种方式调用基类。您可以在“Cody”课程中代码之前或之后调用基础,这取决于您的通话顺序。

class Bob
{
  public virtual void Foo()
  {

  }
}

class Cody
{
  public override void Foo()
  {
    base.Foo()
    // your code
  }
}