Должен ли я использовать наследовать или интерфейс? - PullRequest
2 голосов
/ 27 октября 2009

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

type IFooable =
    interface IDisposable

    abstract Foo : (unit -> unit)

и

type IFooable =
    inherit IDisposable

    abstract Foo : (unit -> unit)

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

Ответы [ 3 ]

6 голосов
/ 27 октября 2009

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

Так что в случае IDisposable это должен быть 'interface'.

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

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

0 голосов
/ 27 октября 2009

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

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

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

"Jetta isa Car, но также IDiesel, IGerman, IBroken"

именно так и поступает мой текущий проект, и я, вероятно, буду осужден за "злоупотребление oop" или что-то в этом роде:

0 голосов
/ 27 октября 2009

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

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