【问题标题】:About C# and Inheritance关于 C# 和继承
【发布时间】:2011-09-02 12:17:13
【问题描述】:

我有一个关于继承如何在 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()'

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

【问题讨论】:

    标签: c# oop inheritance


    【解决方案1】:

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

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

    除此之外,您已经设置好了 - Ferrari 类将满足您的接口,即使方法是派生的。另外顺便说一句,C# 中的命名略有不同:

    • 接口前缀为IIAutomobile
    • 方法上的大写字母:Speedup()Break()Steer()

    【讨论】:

    • 我猜这是 Java 和 C# 之间的区别之一......非常感谢。
    • @IssamTP 其实按照网站上的时间,我只花了 3 分钟就回答了 :-)
    • 是的,但我试图接受答案。我刚看到,但我不能,因为系统说:“你不能接受一个答案 bla bla 7 分钟”...
    • @ IssamTP 我以为你忘记接受答案了...无法阻止自己对此发表评论...
    【解决方案2】:

    您实际上忽略了覆盖抽象类成员。尝试考虑以下内容:

    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();
        }
    }
    

    【讨论】:

    • @IssamTP 这是方法的自动默认实现,因此即使您不提供实现,它也会编译,无论方法是否应该返回值。
    【解决方案3】:

    嗯,“disconnetti”(你是意大利人吗?)方法没有写在任何地方,所以你必须先解释一下它的来源。

    其次,在C#中当你重写一个抽象方法时,你必须通过override关键字显式它

    【讨论】:

    • 是的,我是意大利人,实际代码与发布的代码略有不同,因为此示例更易于理解和解释。无论如何,我很快就编辑了代码......
    • 好的,答案只是顺便说一句,您需要 override 关键字,正如我所写的(以及其他人)。 Buona fortuna col 抄本 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2012-10-20
    相关资源
    最近更新 更多