我有一个关于继承如何在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()'
为什么呢?我该如何解决这个问题?
答案 0 :(得分:16)
您需要使用override
标记方法,以涵盖下面的abstract
定义:
class Ferrari : Car
{
public override void speedup() { }
public override void break() { }
public override void steer() { }
}
除此之外,您已设置 - Ferrari
类将满足您的界面,即使这些方法是派生的。另外,C#中的命名略有不同:
I
,IAutomobile
。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)
其次,在C#中覆盖抽象方法时,必须通过覆盖关键字将其显式化