我想在可能的情况下使用组合来扩展类。但是我遇到了一个特殊问题。如何使用需要更专门的构造函数参数的组合来扩展一个类?
可以说我有一个基类和一个扩展类。该扩展类需要在基类的一个实例,而不是如果我们使用组成从它继承,我们要注入我们的依赖关系:
public class Base
{
private ISomeDependency dependency;
public Base(ISomeDependency dependency)
{
this.dependency = dependency;
}
public ISomeDependency getDependency()
{
return dependency;
}
}
public class Extending
{
private Base base;
public Extending(Base base)
{
this.base = base;
}
}
基类发生在一些依赖然后我们可以在使用使用getDependency()方法扩展类。
但是,如果我们想要专门化扩展类中需要的ISomeDependency的子类,该怎么办。
如果我们使用继承,我们可以简单的亚型传递到父类的构造像这样:
public class Extending extends Base
{
private ISomeDependencySubtype dependency;
public Extending(ISomeDependencySubtype dependency)
{
super(dependency);
this.dependency = dependency;
}
}
但是,如果我们使用成分那么这变得更加困难。我已经想了多种选择:
在基地有一个构造函数的初始化方法,而不是
public class Extending
{
private ISomeDependencySubtype dependency;
private Base base;
public Extending(Base base, ISomeDependencySubtype dependency)
{
base.init(dependency);
this.base = base;
this.dependency = dependency;
}
}
此选项隐藏的扩展类使用init()方法的基本事实所以界面变得不清楚。在使用Extending类时,另一个程序员可能会假设Base实例必须在它传递到Extending实例之前调用init()。
添加一般的参数
public class Base<T extends ISomeDependency>
{
private T dependency;
public Base(T dependency)
{
this.dependency = dependency;
}
public T getDependency()
{
return dependency;
}
}
public class Extending
{
private ISomeDependencySubtype dependency;
private Base<ISomeDependencySubtype> base;
public Extending(Base<ISomeDependencySubtype> base)
{
this.base = base;
this.dependency = base.getDependency();
}
}
这似乎是仿制药的滥用。如果Base类本身就是一个类,并且可以在没有Extending类的情况下使用,那么它不需要关心将ISomeDependency的哪个子类型传递给它。尽管所有的东西都需要重构以适应它,但通用的参数只存在于这个特定的场景中。
实例化基底延伸
public class Extending
{
private ISomeDependencySubtype dependency;
private Base base;
public Extending(ISomeDependencySubtype dependency)
{
this.base = new Base(dependency);
this.dependency = dependency;
}
}
这里面意味着基实例不能被传递,这意味着依赖不能注射。由于可能对大多数人显而易见的原因,这是不灵活的。
所以我想知道人们认为什么是最好的选择使用组合来克服这个问题(请不要继承的答案)。
你的例子有时会包含一个虚假的'extends Base'。 – 5gon12eder 2014-10-03 02:36:50
斑点。将编辑。 – Jonathan 2014-10-04 02:10:25