Я знаю, что функция не существует в C#, но недавно PHP добавила функцию, называемую Traits, которую я считал сначала немного глупой, пока не начал думать об этом.Как бы вы реализовали «шаблонный» дизайн-шаблон в C#?
Скажем, у меня есть базовый класс Client
. Client
имеет одно свойство под названием Name
.
Теперь я разрабатываю повторно используемое приложение, которое будет использоваться многими разными клиентами. Все клиенты согласны с тем, что клиент должен иметь имя, следовательно, он находится в базовом классе.
Теперь клиент А приходит и говорит, что ему также необходимо отслеживать вес клиента. Заказчику B не нужен вес, но он хочет отслеживать высоту. Клиент C хочет отслеживать как вес, так и высоту.
С чертами, мы могли бы сделать как вес и высота особенности черты:
class ClientA extends Client use TClientWeight
class ClientB extends Client use TClientHeight
class ClientC extends Client use TClientWeight, TClientHeight
Теперь я могу удовлетворить все потребности моих клиентов без добавления какого-либо дополнительный пуха к классу. Если мой клиент вернется позже и говорит: «О, мне очень нравится эта функция, могу ли я ее тоже?», Я просто обновляю определение класса, добавляя дополнительный признак.
Как бы вы это сделали в C#?
Интерфейсы здесь не работают, потому что я хочу конкретных определений для свойств и любых связанных методов, и я не хочу их повторно реализовывать для каждой версии класса.
(«Заказчик», я имею в виду буквального человека, который использовал меня в качестве разработчика, тогда как «клиент» я имею в виду класс программирования, у каждого из моих клиентов есть клиенты, которым они хотят записать информацию)
Ну, вы вполне можете имитировать черты в C# с помощью интерфейсов маркеров и методов расширения. – Lucero
@ Lucero Это не черты и не имеют возможности добавлять новых членов (между прочим). Тем не менее, методы расширения являются отличными. –
@Lucero: Это будет работать для добавления дополнительных методов, но что делать, если я хочу хранить дополнительные данные на объекте клиента? – mpen