关于C#和继承

时间:2011-09-02 12:17:13

标签: c# oop inheritance

我有一个关于继承如何在C#中工作的理论/实际问题。

让我们说我必须为一些汽车建模,所以我有一些常用的方法,所有汽车必须实现,飞行员应该知道。在代码字中,这应该是一个接口:

interface Automobile {
   void speedup();
   void break();
   void steer();
   //bla bla
}

现在,除了飞行员可以对他们执行的操作之外,所有类型的汽车应该有一些共同的技术实施,让我们说属性fuelLevel,此时我仍然不想知道汽车如何加速或打破下来,所以我写道:

 abstract class Car : Automobile {
    int fuelLevel;    // for example....
    public abstract void speedup();
    public abstract void break();
    public abstract void steer();
 }

现在我想模拟法拉利,所以:

class Ferrari : Car {
    public void speedup() { ... }
    public void break() { ... }
    public void steer() { ... }
}

现在,在Java中,这段代码应该可以工作(改变一些语法),但在C#中不会因为它说:

Error   1   'Ferrari' does not implement inherited abstract member 'Car.speedup()'
Error   1   'Ferrari' does not implement inherited abstract member 'Car.break()'
Error   1   'Ferrari' does not implement inherited abstract member 'Car.steer()'

为什么呢?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:16)

您需要使用override标记方法,以涵盖下面的abstract定义:

class Ferrari : Car 
{
    public override void speedup() { }
    public override void break() { }
    public override void steer() { }
}

除此之外,您已设置 - Ferrari类将满足您的界面,即使这些方法是派生的。另外,C#中的命名略有不同:

  • 前缀与IIAutomobile
  • 的接口
  • 关于方法的大写字母:Speedup()Break()Steer()

答案 1 :(得分:3)

您实际上忽略了覆盖抽象类成员。试着考虑一下:

interface IAutomobile
{
    void Steer();
    void Break();
}

abstract class Car : IAutomobile
{
    public abstract void Steer();
    public abstract void Break();
}

class Ferrari : Car
{
    public override void Steer()
    {
        throw new NotImplementedException();
    }

    public override void Break()
    {
        throw new NotImplementedException();
    }
}

答案 2 :(得分:1)

好吧,“disconnetti”(你是意大利人吗?)方法不会写在任何地方,所以你必须先解释我们来自哪里。

其次,在C#中覆盖抽象方法时,必须通过覆盖关键字将其显式化