在我的设计中对继承与否感到困惑

Confusion regarding having inheritance or not in my design

提问人:I Love Stackoverflow 提问时间:6/14/2019 最后编辑:I Love Stackoverflow 更新时间:6/14/2019 访问量:71

问:

我有这样的要求,可以.DriverMechanicStart,ApplyBrakes,ChangeGear and Stop the Car

我还有 2 个额外的功能,这是唯一可以且不应该这样做的功能。MechanicChangeOilAdjustBrakesDriver

基于此,这是我准备的:

 interface IDrivable
    {
        void Start();
        void ApplyBrakes();
        void ChangeGear();
        void Stop();
    }

    interface IFixable
    {
        void ChangeOil();
        void AdjustBrakes();
    }

    public class Car : IDrivable, IFixable
    {
        public void AdjustBrakes()
        {
            throw new NotImplementedException();
        }

        // implement all the methods here
        public void ApplyBrakes()
        {
            throw new NotImplementedException();
        }

        public void ChangeGear()
        {
            throw new NotImplementedException();
        }

        public void ChangeOil()
        {
            throw new NotImplementedException();
        }

        public void Start()
        {
            throw new NotImplementedException();
        }

        public void Stop()
        {
            throw new NotImplementedException();
        }
    }

    class Driver
    {
        private IDrivable car;
        public Driver(IDrivable car)
        {
            this.car = car;
        }
        public void driveCar()
        {
            this.car.Start();
            this.car.ChangeGear();
            this.car.ChangeGear();
        }
    }

    class Mechanic
    {
        private IDrivable _drivableCar;
        private IFixable _fixableCar;

        public Mechanic(IDrivable drivableCar, IFixable fixableCar)
        {
            this._drivableCar = drivableCar;
            this._fixableCar = fixableCar;
        }

        public void driveCar()
        {
            this._drivableCar.Start();
        }
    }

 class Program 
    {
        static void Main(string[] args)
        {
            var driver = new Driver(new Car());
            driver.driveCar();
            var mechanic = new Mechanic(new Car(), new Car());
        }
    }

我在这里感到困惑,以至于我是否应该添加很少来代表驾驶员和机械师。像这样的东西:abstraction

abstract class User
    {
       public abstract void DriveCar();
    }

 class Mechanic : User { }
 class Driver : User { }

如果是,那么拥有这个有什么好处,它将如何提供帮助?abstraction

另一个问题是什么时候有这种有意义?abstraction

如果有的话,我也想得到关于这个设计的反馈。

谢谢

C# OOP 继承与 语言无关的 抽象

评论

1赞 6/14/2019
埃里克·利珀特(Eric Lippert)写了一篇冗长的多部分博客文章,内容涉及您可能感兴趣的类似内容:巫师和战士
0赞 Hovercraft Full Of Eels 6/14/2019
删除了 java 标记。请避免向编程语言标签发送垃圾邮件。最相关的编程标签应该是足够的 - 或者,如果语言真的无关紧要,你可以使用与语言无关的标签。
0赞 I Love Stackoverflow 6/14/2019
@elgonzo我已经读过了,但我正试图在我的设计背景下理解这一点。还有为什么要关闭和反对?我在问题中缺少什么?
0赞 I Love Stackoverflow 6/14/2019
@HovercraftFullOfEels 对不起,我不知道与语言无关的标签,语言并不重要,这就是为什么我同时标记了 java 和 c#
1赞 Patrick Artner 6/14/2019
您的机械师正在试驾一个汽车实例并修理另一个汽车实例。为什么要给他 2 个不同的汽车实例?你可以给他一辆车,他可以看到汽车是否/哪个接口装满了

答:

0赞 Romain Brisse 6/14/2019 #1

没有抽象的设计是正确的,看起来不错。但是,如果您想添加抽象级别,我不会使用您提供的示例,因为正如您所怀疑的那样,它不会给整体设计带来任何东西。

你可以做的是让 Mechanic 类继承自 Driver 类,因为我认为机械师毕竟必须是驱动程序。这样一来,如果 Driver 类必须更改,则可以简化将来的工作。