Интерфейс для дизайна базового класса - PullRequest
0 голосов
/ 23 сентября 2018

считают, что у меня есть класс клиента, и он получил CustomerTypeA, CustomerTypeB, CustomerTypeC в качестве дочерних классов.

Будет ли лучше реализовать интерфейс ICustomer для класса Customer и создавать объекты подтипов (CustomerTypeA, CustomerTypeB, CustomerTypeC)

interface ICustomer {}

class Customer : ICustomer {}

class CustomerTypeA : ICustomer {}
class CustomerTypeB : ICustomer {}
class CustomerTypeC : ICustomer {}

ICustomer obj;
obj = new CustomerTypeB();

или

Создание объектовдочерних классов с объявлением объекта класса Customer?

class Customer {}
class CustomerTypeA : Customer {}
class CustomerTypeB : Customer {}
class CustomerTypeC : Customer {}

Customer obj;
obj = new CustomerTypeB();

Как мне выбрать подход, которому нужно следовать?

Другими словами, лучше ли реализовать каждый родительский объект для реализации?из интерфейса?какое преимущество это приносит мне?

Спасибо

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Как правило, вы можете использовать оба.Но если ваш класс «Клиент» нужен где-то еще, я бы либо выбрал второе решение (простое наследование), либо изменил бы первое решение на это (при условии, что ваши CustomerTypes по-прежнему имеют что-то общее с Customer):

interface ICustomer{}
class Customer:ICostumer{}
class CustomerTypeA:Customer{}
...

А при его использовании:

ICustomer myCustomer=new CustomerTypeA();
0 голосов
/ 23 сентября 2018

Я думаю, что это может быть решено только при наличии дополнительных знаний о конкретном случае использования.Следует помнить, что в C # у вас может быть только один базовый класс.Таким образом, ваш второй вариант может работать, только если вам не нужно наследовать от каких-либо других классов в любом из подклассов.

Итак, в общем, я думаю, что первый подход более гибкий, и если вы хотите избежать дублирования кода в ваших подклассах, вы можете рассмотреть возможность реализации разделяемой логики в классе Customer и наследовать отэто везде, где это возможно.Если один из ваших подклассов должен наследоваться от другого класса, он, конечно, может реализовать ICustomer.

Кроме того, если разделяемая логика представляет собой более крупный фрагмент кода / функциональности и вы не можете использовать наследование (из-за наличия другого базового класса), вы также можете рассмотреть возможность использования делегирования (составление по шаблону наследования / стратегии).).

0 голосов
/ 23 сентября 2018

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

Чтобы решить, что лучше в вашем случае, вы должны изучить, как может развиваться иерархия типов, каковы ваши реальные требования, как вы хотите писать автоматические тесты и т. Д.

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