Как написать часть конструкторов childs только один раз? - PullRequest
0 голосов
/ 13 октября 2018

В настоящее время я работаю с абстрактным классом Room, в котором есть семь разных дочерних классов.Меня тошнит от вставки копий части конструктора одного из дочерних элементов в другие шесть, если я добавляю что-то в абстрактный класс (например, свойство name).

Каким образом я не могунарушить принцип СУХОГО при добавлении свойства, которое должно быть установлено одинаковым / созданным для каждого дочернего элемента?

Пример:

public abstract Room
{
    // Need to be assigned in constructor.
    protected int RoomNumber { get; set; } 
    protected int PositionX { get; set; }
    protected int PositionY { get; set; }

    // Always the same at the start
    protected List<Guest> GuestsInRoom { get; set; }
    protected string ImageFilePath { get; set; }
}

public class Bedroom : Room
{
    private string Classification { get; set; }
    public Bedroom()
    {
        // Assign/instantiate all properties.
    }
}

public class Bathroom : Room
{
     private string SomeOtherProperty { get; set; }
     public Bedroom()
     {
         // Assign/instantiate all properties again
     }
 }

1 Ответ

0 голосов
/ 13 октября 2018

Добавить конструктор в базовый класс.Если есть поля, которые необходимо назначить, укажите для них обязательные параметры.Вы можете вызвать непустой конструктор родительского класса с помощью ": base ()", показанной в модифицированном классе спальни.

public abstract Room
{
    // Need to be assigned in constructor.
    protected int RoomNumber { get; set; } 
    protected int PositionX { get; set; }
    protected int PositionY { get; set; }

    // Always the same at the start
    protected List<Guest> GuestsInRoom { get; set; }
    protected string ImageFilePath { get; set; }

    protected Room(int roomNumber, int positionX, int positionY)
    {
        RoomNumber = roomNumber;
        PositionX = positionX;
        PositionY = positionY;
        GuestsInRoom = new List<Guest>();
    }
}

public class Bedroom : Room
{
    private string Classification { get; set; }
    public Bedroom(string classification, int roomNumber, int positionX, int positionY) 
        : base(roomNumber, positionX, positionY)
    {
        // Assign/instantiate all properties.
        Classification = classification;
    }
}
...