2015-02-09 12 views
1

Я запутался между интерфейсами и абстрактными классами. Я знаю, что технические различия между ними, такие как интерфейсы, не могут иметь поля, в то время как абстрактные могут, а также интерфейсы применяют множественное наследование, а абстрактные классы не могут.Почему выбрать абстрактный (без реализации по умолчанию) через интерфейс vb.net?

Мне интересно, есть ли у меня абстрактный класс с 4 методами, но без реализации по умолчанию, и у меня есть интерфейс с четырьмя методами, слишком уверенными без реализации, в этот момент в чем разница между их использованием? Они выглядят одинаково для меня!

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

+0

В случае * угла *, где у вас есть абстрактный класс с 0% реализованных методов, они действительно напоминают интерфейсы. Но это далеко не * обычное * использование, когда некоторые или все методы будут иметь (по умолчанию) реализацию. –

+0

В некотором сценарии вы можете объявить открытый интерфейс и абстрактный класс внутренним или частным, чтобы любой иностранный код знал и использовал только интерфейс и ваш абстрактный класс, предоставляя вам стандартную (или пустую) реализацию интерфейса. Затем вы получите из абстрактного класса некоторые другие (конкретные) классы для конкретных потребностей, которые не являются общими для друг друга и, следовательно, не могут быть реализованы непосредственно в абстрактном (базовом) классе.Эта иерархия может быть полезна, когда вам (действительно) нужны разные аналогичные классы, чтобы поделиться каким-то общим поведением, но хотите скрыть свое существование. –

+0

спасибо всем за ваши ответы –

ответ

1

Правило для их выбора является следующее:

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

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

0

Абстрактные классы предлагают по крайней мере три преимущества над интерфейсами:

  1. Абстрактные классы могут иметь поля, но интерфейсы не могут. В то время как объекты с открытым доступом не должны иметь общедоступные поля, иногда это может быть полезно для классов , экземпляры которых никогда не будут открыты для общественности. Например, поле типа Int32 можно безопасно передать в качестве параметра ref методу, который обновляет его, например, Interlocked.Increment; свойство не может. Хотя может быть возможно объединить свойство типа Int32, а также предоставить такие методы, как AtomicIncrementFoo, использование поля может избежать необходимости в большом шаблоне.

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

  3. Абстрактные классы могут определять реализации по умолчанию для методов, но даже если 99% классов, реализующих интерфейс, будут использовать одинаковый код для метода, каждый отдельно должен определить void SomeMethod(int Foo) { MyInterfaceHelper.SomeMethod(this, Foo); }. Мало того, что это влечет за собой большой код шаблона, но желание свести к минимуму шаблонный код часто заставляет авторов интерфейса опускать вещи, которые действительно должны содержать интерфейсы.

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

Смежные вопросы