Остановитесь, остановитесь, остановитесь.
Это не то, как вкладки 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. Основное отличие состоит в том, что абстрактный класс может содержать реализацию по умолчанию, тогда как интерфейс не может.
Интерфейс - это контракт поведения без какой-либо реализации.
Лучшая практика заключается в использовании интерфейса для определения контракта и абстрактного класса как одной их реализации. Этот абстрактный класс может заполнить большую часть шаблона, поэтому вы можете создать реализацию, просто переопределив то, что вам нужно или что вы хотите, без принуждения вас использовать конкретную реализацию.
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.