JustJoe_066
@JustJoe_066

Как добавить одно поле множеству классов без применения наследования и добавления поля в каждый класс по отдельности?

Допустим есть две сущности, для которых определены некоторые поля, им нужно добавить одно boolean поле, вопрос, как это лучше сделать, соблюдая уже принятые код-конвенции?
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 2
@mvv-rus
Настоящий админ AD и ненастоящий программист
Привыкли к миксинам в языке с динамической типизацией? В C# их нет, и вряд ли будут, потому что типизация тут статическая. И приемы программирования - соответственно, другие.

В частности, чтобы добавить дополнительное свойство (или метод) в классы из разных иерархий наследования, используйте интерфейс. Примерно так (примеры - на основе кода из комментариев):
public interface IChosable {
    bool IsChosen {get; set;}  //Желательно имена писать таки на английском правильном
                                             // а не ломаном. А то глаза режет.
                                             //Ну, или хотя бы - по русски транслитом: 
                                             // Vybrano вместо IsChoised - и то лучше, IMHO
}

//...
    public class ViewedDirectoryData : DirectoryDataEntity, IChosable
    {
        public bool IsChosen {get; set;}  
    }

    public class ViewedOutputData : OutputData, IChosable
    {
        public bool IsChosen {get; set;}  
    }

Но свойства, таки да, придется определять в каждом классе, реализующем интерфейс (но можно перенести их, вместе с указанием реализации интерфейса, в базовые классы иерархий).

Удобство тут в том, что ссылку на любой из классов, реализующих интерфейс, можно привести к типу интерфейса - тогда и статический контроль типов сохраните, и работать со всем этими классами можно будет единообразно.
Ответ написан
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Начиная с C#8 есть реализация интерфейсов по умолчанию. В туториалах майков есть пример реализации mixin'ов с их помощью - https://learn.microsoft.com/en-us/dotnet/csharp/ad...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы