вопрос интерфейса - PullRequest
       34

вопрос интерфейса

0 голосов
/ 08 апреля 2009

У меня есть объект под названием Foo. Прямо сейчас он реализует IFoo, который имеет много свойств.

У меня есть один класс, который зависит только от нескольких из этих свойств, поэтому я создаю IMeasurableFoo (у которого просто есть несколько свойств)

чтобы избежать дублирования кода, теперь у меня есть IFoo: IMeasurableFoo, поскольку я переместил свойства в IMeasurableFoo

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

мысли о том, как организовать эти абстракции

Например, если это были конкременты:

Птица не наследует от FlyingBird (будет наоборот)

Ответы [ 7 ]

5 голосов
/ 08 апреля 2009

Нет, это не «более общий интерфейс, наследующий от определенного интерфейса». IMeasurableFoo, имеющий только несколько свойств, является универсальным интерфейсом , тогда как IFoo является более конкретным, поскольку он уточняет знания о IMeasurableFoo. Подумайте, IList наследует от IEnumerable.

4 голосов
/ 08 апреля 2009

Может поменять имена? IMeasurableFoo действительно звучит как более специфичный интерфейс, но не могли бы вы просто назвать его IFoo и переименовать оригинальный интерфейс IFoo? Или переименовать оба?

Является ли IMeasurableFoo действительно IFoo или (возможно) IMeasurable?

1 голос
/ 08 апреля 2009

Нет, я не думаю, что с этим что-то не так. Возможно, это просто название IMeasurableFoo, которое вводит в заблуждение, поскольку оно просто измеримо и не является полным Foo.

1 голос
/ 08 апреля 2009

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

Если Foo не является MeasurableFoo, наследование не требуется.

0 голосов
/ 08 апреля 2009

Что здесь странного? Наследование интерфейса увеличивает количество методов и свойств для каждого уровня наследования.

Переименуйте IMeasurableFoo в IBar, и больше смысла в специфичности / большей универсальности не будет

0 голосов
/ 08 апреля 2009

В подобных случаях я думаю, что наименование вещи - это проблема, а не сама вещь. Другими словами, интерфейс с меньшим количеством членов имеет тенденцию быть более абстрактным, чем интерфейс с большим количеством членов.

0 голосов
/ 08 апреля 2009

Я не думаю, что IMeasurableFoo менее универсален. Поскольку IFoo включает IMeasurableFoo, я бы сказал, что IMeasurebleFoo является более общим.

Такое ощущение, что у вас IBaseInterface и IExtendedInterface: IBaseInterface.

Другими словами, я думаю, у вас правильный подход.

РЕДАКТИРОВАТЬ: с вашим примером IBird и IFlyingBird, у вас просто есть проблема с именами. Должно быть:

public interface IFlyer
{
    void Fly();
}

public interface IBird : IFlyer
{
    void Chirp();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...