Это зависит.
Шаблон абстрактного класса + потомки известен как кластер класса в терминологии Какао. Хорошо известными примерами являются NSString
и NSArray
. Основным преимуществом этого подхода является то, что вы можете реализовать методы базового класса, которые работают в терминах базового набора методов и наследуются; например, подкласс NSString
должен только реализовать -length
и -characterAtIndex:
для всех открытых методов экземпляра NSString
для работы (хотя это не будет очень эффективно).
Недостатком этого шаблона является то, что реализации должны наследоваться от базового класса, что может быть серьезным ограничением в языке с одним наследованием.
Протокол, с другой стороны, может быть принят любым классом, но не может обеспечить базовую реализацию. Это очень похоже на статически проверенную версию набора текста уткой; приняв протокол, который вы утверждаете, что можете крякать, и, требуя протокол, вы можете ограничить параметр классами, способными к кряку, не требуя определенного базового класса.
Если вы планируете предоставить стандартный набор реализаций для своей абстракции, вам, вероятно, нужен кластер классов. Если вы хотите общаться с открытым набором объектов, реализующих вашу абстракцию, вам, вероятно, нужен протокол.