Несколько соединяют интерфейсом с наследованием

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

interface ICommon {...}  // Members common to all widgets
interface IWidget1 {...} // specialized members of widget type 1
interface IWidget2 {...} // specialized members of widget type 2

Я пытаюсь выбрать между наличием наследования в интерфейсах, или в классе. Так, а именно, я могу или сделать это как это:

interface IWidget1 : ICommon {...}
interface IWidget2 : ICommon {...}
class Widget1 : IWidget1 {...}
class Widget2 : IWidget2 {...}

... или как это...

class Widget1: ICommon, IWidget1 {...}
class Widget2: ICommon, IWidget2 {...}

Там какой-либо неопровержимый довод состоит в том, чтобы пойти так или иначе?

Обновление: это влияло бы на ответ, если классы должны быть COM-видимы?

5
задан Tim Long 3 March 2010 в 06:40
поделиться

3 ответа

Вы должны выбрать наследование интерфейса тогда и только тогда, когда тип, реализующий IWidget1 , должен также реализовать ICommon. В любом случае класс будет реализовывать как IWidget1, так и ICommon отдельно. Единственное отличие состоит в том, что если вы сделаете IWidget1 "производным" от ICommon, вы обеспечите соблюдение того факта, что IWidget1 также должен быть ICommon.

Хорошим примером являются IEnumerable и ICollection. Каждый ICollection гарантированно является IEnumerable, поэтому ICollection является производным от IEnumerable. Если бы это было законно или имело смысл быть коллекцией, но не было бы перечислимым, то разработчикам ICollection также не пришлось бы реализовывать IEnumerable.

Что бы вы ни выбрали, это не повлияет на видимость COM. .NET все равно будет экспортировать интерфейсы отдельно, если я правильно помню.

6
ответ дан 13 December 2019 в 22:06
поделиться

Используйте принцип подстановки Лискова, чтобы найти ответ.

Если IWidget1 можно заменить для всех клиентов, работающих в терминах ICommon1, тогда вы можете унаследовать IWidget1 от ICommon1. Если не пойти с классом, реализующим несколько интерфейсов.

3
ответ дан 13 December 2019 в 22:06
поделиться

Наследование зависит от атрибута / поведения класса или интерфейса. Если поведения в IWidget1 и IWidget2 включают все поведения в ICommon , то вы, несомненно, можете наследовать такие же, как IWidget1: ICommon и IWidget2: ICommon и нет никаких проблем с ComVisible . Это просто концепция OOPS.

0
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

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