Путаница относительно наличия наследства или нет в моем дизайне - PullRequest
0 голосов
/ 14 июня 2019

У меня есть такое требование, что Driver и Mechanic могут Start,ApplyBrakes,ChangeGear and Stop the Car.

У меня также есть 2 дополнительные функции, которые Mechanic являются единственными, кто может ChangeOil и AdjustBrakes и Driver не должны быть в состоянии сделать это.

Исходя из этого, вот что я подготовил:

 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 голосов
/ 14 июня 2019

Ваш дизайн без абстракции правильный, выглядит хорошо. Однако, если вы хотите добавить уровень абстракции, я бы не использовал приведенный вами пример, потому что, как вы и подозревали, он ничего не вносит в общий дизайн.

То, что вы могли бы сделать, это сделать класс Mechanic наследуемым от класса Driver, потому что, в конце концов, механик должен быть водителем, я думаю. При этом вы упростили бы будущую работу, если класс Driver обязательно изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...