关于在设计中是否继承的困惑

时间:2019-06-14 10:49:54

标签: c# oop inheritance language-agnostic abstraction

我这样要求DriverMechanic可以Start,ApplyBrakes,ChangeGear and Stop the Car

我还有2个附加功能,就是Mechanic是唯一可以ChangeOilAdjustBrakesDriver不能这样做的人。

基于此,这就是我准备的:

 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有意义?

如果有任何设计,我也希望获得反馈。

谢谢

1 个答案:

答案 0 :(得分:0)

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

您可以做的是使Mechanic类继承自Driver类,因为我认为毕竟机械必须是驾驶员。这样,如果必须更改Driver类,则可以简化以后的工作。