Согласно «Банде четырех»: «Пользуйся композицией, а не наследством», и это идеальная причина для этого ...
Если у нас есть суперкласс, который выглядит следующим образом:
public class SuperClass : Person
Суперкласс может легко декорировать класс Person, добавляя свойства, не найденные в классе Person.
Но что произойдет, если украшения Superclass предназначены только для графического интерфейса? Например, значение bool, обозначающее «Выбрано». Мы все еще можем получить всех людей из БД в списке, но у нас возникают проблемы при попытке создать суперкласс и объединить результаты БД.
foreach( var person in myPersonList){
var sc = new SuperClass();
sc.Selected = false;
sc=person;
}
Компилятор жалуется, потому что Суперкласс не Перс, а компилятор. Единственный способ заполнить свойства подкласса Person - это выполнить итерацию и установить каждый из них ... вот так.
SuperClass.Name = Person.Name;
SuperClass.Id = Person.ID;
Довольно скучно. Но есть и лучший способ .... Не заставляйте суперкласс наследовать от Person
public class SuperClass{
public Person ThisPerson {get;set;}
public bool Selected {get;set;}
}
Это дает нам «сдерживание». Суперкласс теперь содержит класс Person.
Теперь мы можем сделать это:
foreach(var person in MyPersonList){
var sc = new Superclass();
sc.Selected = false;
sc.Person = person;
}
Потребитель этого класса теперь должен квалифицировать свойства Суперкласса / Человека следующим образом ...
forach(var sc in MySuperClassList){
var selected = sc.Selected;
var name = sc.Person.Name;
}
Прелесть этого в том, что в будущем вы можете добавить любой другой контейнер, который вам нужен, и он НЕ повлияет на другие контейнеры. Вы также можете трансформировать суперкласс во все, что в нем содержится. Если каждый из содержащихся в нем классов становится интерфейсом, то это еще один шаг вперед.