Должен ли я использовать наследование или интерфейс?

В чем разница между:

type IFooable =
    interface IDisposable

    abstract Foo : (unit -> unit)

а также

type IFooable =
    inherit IDisposable

    abstract Foo : (unit -> unit)

?

Если эквивалентно, в каких случаях я должен использовать один над другим? Спасибо!


person Stringer    schedule 27.10.2009    source источник


Ответы (3)


(Сначала я так думал) Вы должны использовать «наследовать» с (не более чем одним) базовым классом. Вы можете использовать «интерфейс» для любых интерфейсов, которые вы собираетесь реализовать.

Так что в случае IDisposable это должен быть «интерфейс».

РЕДАКТИРОВАТЬ, хорошо, компилятор это позволяет, но это может быть ошибка, я посмотрю

РЕДАКТИРОВАТЬ: оказывается, что это вероятная ошибка с другой стороны, и вероятные интерфейсы заставят вас использовать «наследовать» для наследования других интерфейсов, идея заключается в том, что «унаследованные» члены всегда видны непосредственно в смысле «неявного интерфейса», тогда как Объявление интерфейса в классе — это «явный» интерфейс, который требует приведения к этому типу интерфейса для использования этих членов. Так или иначе, мы, вероятно, удалим эту гибкость синтаксиса языка, так что будет только один способ создания этого, а не два эквивалентных способа.

person Brian    schedule 27.10.2009
comment
Имеет смысл. Теперь я лучше понимаю это. Большое спасибо! - person Stringer; 31.10.2009

Я склонен использовать наследование для истинного oop (т.е. X равно Y) и интерфейсы как своего рода реализацию декоратора.

вероятно, это не "правильный" способ сделать это де-факто, но нам это очень нравится.

я имею в виду, что X унаследует Y, но тогда мы захотим дать ему дополнительную функциональность от V, W и Z.

«Jetta — это автомобиль, но также и I Diesel, I German, I Broken»

это именно то, как это делает мой текущий проект, и меня, вероятно, проголосуют за «злоупотребление oop» или что-то в этом роде :)

person Oren Mazor    schedule 27.10.2009
comment
Звучит безумно. Что, если в вашей машине реализованы и IBroken, и IWorkingOrder? АйТойота и АйФорд? - person Stringer; 27.10.2009
comment
ладно, это был ужасный пример! :) на самом деле лучшим примером был бы TabControl с кучей специализированных вкладок. некоторые из них являются ITxRx, потому что у них есть определенные типы поведения. другие другого рода. сумасшедший дизайн, конечно, но, как ни странно, он работает очень хорошо. - person Oren Mazor; 27.10.2009

вам следует использовать интерфейсы, если вы собираетесь использовать только абстрактные методы. Потому что вы можете наследовать только один класс, но можете реализовать множество интерфейсов.

person L Digital Dash    schedule 27.10.2009