Интерфейс или Абстрактный класс: какой использовать?

Остановитесь, остановитесь, остановитесь.

Это не то, как вкладки Vim разработаны, чтобы использоваться. На самом деле они неверно называются. Лучшее имя было бы "областью просмотра" или "расположением", потому что это что вкладка is— это - различное расположение окон [1 116] весь из Ваших существующих буферов.

Попытка разбить Vim в 1 вкладку == 1 буфер является упражнением в тщетности. Vim не знает или заботится, и он не будет уважать его на всем commands— в частности, что-либо, что использует буфер quickfix (:make, :grep, и :helpgrep те, которые приходят на ум) счастливо проигнорирует вкладки, и нет ничего, что можно сделать для остановки этого.

Вместо этого:

  • :set hidden
    , Если у Вас уже нет этого набора, затем сделайте так. Это заставляет энергию работать как любые несколько-редакторов-файлов над планетой. Можно было отредактировать буферы, которые не видимы в окне где-нибудь.
  • Использование :bn, :bp, :b #, :b name, и ctrl-6 для переключения между буферами. Мне нравится ctrl-6 самому (один, это переключается на ранее используемый буфер, или #ctrl-6 переключатели для буферизации номера #).
  • Использование :ls для списка буферов или плагина как [1 113] MiniBufExpl или BufExplorer.

314
задан Darryl Hein 24 May 2018 в 06:11
поделиться

3 ответа

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

Интерфейс - это контракт поведения без какой-либо реализации.

13
ответ дан 23 November 2019 в 01:06
поделиться

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

64
ответ дан 23 November 2019 в 01:06
поделиться

Use an interface when you want to force developers working in your system (yourself included) to implement a set number of methods on the classes they'll be building.

Use an abstract class when you want to force developers working in your system (yourself included) to implement a set numbers of methods and you want to provide some base methods that will help them develop their child classes.

Another thing to keep in mind is client classes can only extend one abstract class, whereas they can implement multiple interfaces. So, if you're defining your behavior contracts in abstract classes, that means each child class may only conform to a single contract. Sometimes this a good thing, when you want to force your user-programmers along a particular path. Other times it would be bad. Imagine if PHP's Countable and Iterator interfaces were abstract classes instead of interfaces.

One approach that's common when you're uncertain which way to go (as mentioned by cletus below) is to create an interface, and then have your abstract class implement that interface.

447
ответ дан 23 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: