У меня есть Configurator
класса, для того, чтобы сделать свою работу, должны получать Context
объект через интерфейс:Как использовать композицию вместо наследования?
public class Configurator : IContextAware
{
private IContext _context;
//property setter defined by the IContextAware interface
public IContext Context { set { _context = value; } }
// use _context object in other methods here ...
}
я планирую писать МНОГО Configurator
типов, которые будут все необходимых для инициализации их _context
полей так же. Моя первая мысль была «Почему не гнев каждого программиста в Интернете и использование наследования»?
public class ContextInitializer: IContextAware
{
// field to hold the injected context
protected IContext _context;
//property setter defined by the IContextAware interface
public IContext Context { set { _context = value; } }
}
public class Configurator : ContextInitializer
{
// use _context object here ...
}
Таким образом, любые другие классы, которые я пишу, что нужен объект контекста может просто наследовать от ContextInitializer, и использовать объект контекста сразу.
Плюсы: гарантированное последовательной инициализации, не отвлекающее, дублированный код инициализации в каждом классе
Минусы: Наследование реализации есть зло, .. гм, Конфигуратор не может наследовать от любого другого класса .. ??
Я должен уточнить, что так или иначе Конфигуратор должен реализовывать интерфейс IContextAware
. ТАКЖЕ, класс должен иметь конструктор по умолчанию/no-arg, поэтому инъекция зависимостей конструктора здесь не вариант.
Может ли кто-нибудь предложить, как можно использовать композицию для достижения тех же преимуществ, но с более гибким дизайном и/или описать реальные недостатки решения наследования выше? Благодаря!
P.S. Это адаптировано для Spring.Net CodeConfig, если кому-то интересно.
Наследование - это зло? Я пропустил эту записку. – Rik
@Rik http://blogs.msdn.com/b/steverowe/archive/2008/04/28/prefer-composition-over-inheritance.aspx http://www.javaworld.com/javaworld/jw-08- 2003/jw-0801-toolbox.html http://c2.com/cgi/wiki?ImplementationInheritanceIsEvil По правде говоря, если бы меня спросили: «Является ли' Configurator' 'ContextInitializer'? Я должен был бы сказать« нет », но ИСПОЛЬЗУЕТ' ContextInitalizer', тем самым предлагая наследование, не совсем здесь. – AFischbein
Абсолютные утверждения * всегда * неправильные. Наследование не является по своей сути злым. Это инструмент. Вы можете использовать молоток, чтобы положить гвоздь в стену или взломать кого-то череп Это то, как вы его используете, это может быть зло. – Corak