Причины не использовать абстрактный класс вместо интерфейса? - PullRequest
5 голосов
/ 24 апреля 2011

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

type IMyInterface =
    abstract Name : string
    abstract Text : string

type MyClass() =
    member __.Name = "name"
    member __.Text = "text"
    interface IMyInterface with
        member this.Name = this.Name
        member this.Text = this.Text

Я бы

[<AbstractClass>]
type MyAbstractClass() =
    abstract Name : string
    abstract Text : string

type MyClass() = 
    inherit MyAbstractClass()
    override __.Name = "name"
    override __.Text = "text"

Какие-либо слова предостережения или последствия, которые я должен знать здесь?

Ответы [ 3 ]

8 голосов
/ 24 апреля 2011

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


Кроме этого, некоторые рекомендации по использованию абстрактных классов или интерфейсов:

  • Если вы планируете создать несколько версий вашего компонента, создайте абстрактный класс.Абстрактные классы предоставляют простой и легкий способ создания версий ваших компонентов.При обновлении базового класса все наследующие классы автоматически обновляются с изменением.Интерфейсы, с другой стороны, не могут быть изменены после создания.Если требуется новая версия интерфейса, необходимо создать совершенно новый интерфейс.
  • Если создаваемая вами функциональность будет полезна для широкого круга разнородных объектов, используйте интерфейс.Абстрактные классы должны использоваться главным образом для объектов, которые тесно связаны, тогда как интерфейсы лучше всего подходят для предоставления общих функциональных возможностей несвязанным классам.
  • Если вы разрабатываете небольшие, краткие кусочки функциональности, используйте интерфейсы.Если вы разрабатываете большие функциональные блоки, используйте абстрактный класс.
  • Если вы хотите обеспечить общую, реализованную функциональность среди всех реализаций вашего компонента, используйте абстрактный класс.Абстрактные классы позволяют вам частично реализовать ваш класс, тогда как интерфейсы не содержат реализации для каких-либо членов.

http://msdn.microsoft.com/en-us/library/scsyfw1d%28vs.71%29.aspx

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

4 голосов
/ 24 апреля 2011

Стивен

Только один, самый простой и очевидный ... Интерфейс допускает альтернативные реализации; если «опубликованный общеизвестный тип» является абстрактным классом, вы не сможете впоследствии предоставить любые альтернативы ... Поэтому недостатком является то, что вы ограничиваете свои будущие возможности; положительным моментом является то, что (в зависимости от того, сколько существует наследников) вы можете сэкономить много кода.

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

И я полагаю, вы МОЖЕТЕ сделать и то, и другое, и я думаю, это дало бы вам самое лучшее из обоих миров.

Приветствия. Кит.

PS: manojlds, конечно, прав ... и тааак гораздо более суровым; -)

2 голосов
/ 24 апреля 2011

В абстрактном классе вы можете реализовать общее поведение всех подклассов.

В вашем дизайне интерфейса вы можете захотеть, чтобы метод вызывал другой метод для выполнения какой-то сложной задачи.Например, predictAll(Instance array) может использовать predictSingle(Instance) и обеспечивает реализацию по умолчанию для всех подклассов.Если вы используете интерфейс, вам нужно реализовать predictAll во всех подклассах.

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

Интерфейс также поддерживает дизайн.

Еще один момент: интерфейс поддерживает больше функционального кода, чем абстрактный класс.Класс типов в Haskell - более мощный интерфейс.

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