我受到设计问题的挑战,我将在下面尝试描述。
假设一个类(称为A)具有带有一堆参数的构造函数。因为在每个实例化中编写所有这些参数都很累,所以我编写了另一个类,称之为StyleSheetA,它封装了所有这些参数,并且是A构造函数的唯一参数。这样,我可以准备一些默认值StyleSheetA模板稍后将使用,如果需要,我可以修改它们。
此时,我需要扩展A.假设B扩展A. B将拥有自己的样式表,即StyleSheetB。我认为StyleSheetB扩展StyleSheetA是合适的,所以使用一个样式表参数,B的构造函数也可以构造它的超类A.但我担心这个设计可能有缺陷的可能性。例如,如果我决定为样式表添加getter / setter,该怎么办?是否有一种新颖的方式来处理所有这些情况?我错了吗?对于那些困惑的人,我在这里附上一些代码:
class A
{
StyleSheetA ss;
A(StyleSheetA ss)
{
this.ss = ss;
// Do some stuff with ingredients of styleSheet
}
}
class StyleSheetA
{
int n1;
int n2;
// :
// :
int n100;
}
class B extends A
{
B(StyleSheetB ss)
{
super(ss);
// Do some stuff with ingredients of styleSheet
}
}
class StyleSheetB extends StyleSheetA
{
int n101;
int n102;
// :
// :
int n200;
}
感谢您提供任何帮助或建议,也欢迎任何评论家。
编辑:我正在使用java开发,因此没有泛型支持。
答案 0 :(得分:5)
在我看来,你只是在解决从A
课到StyleSheetA
课的参数过多的问题。
为了说明我的观点,请想一想这个问题:你如何实例化StyleSheetA
?无论如何,可能使用接受所有这些参数的构造函数。此设计可能给您带来的唯一好处是,如果您有StyleSheetA
对象封装的同一组参数值,您将在A
的多个实例中重复使用这些参数值。如果是这样,请记住,尽管您有A
的不同实例,但它们会共享相同的参数,因此它不是一个好的选择。
我可以向您推荐的是尝试重构您的课程A
本身。尝试将其分解为更小的类。如果是nesseccary,请尝试创建子类以避免条件分支等。
现在,我不知道你的班级A
是什么样的,但是如果你这样做,你将会有几个类,每个类都有自己的一组参数。如果任何参数是一个鉴别器(意味着它确定了类“类型”),你将能够摆脱它,只需使用子类,并依靠内置类型系统来代替它。
答案 1 :(得分:3)
您是否考虑使用IoC容器(如StructureMap)来管理构造函数依赖项?这可能会使这些东西变得更容易。
答案 2 :(得分:2)
关于getter和setter问题的想法:
'B'中的构造函数意味着附加参数(n101 +)对于类的操作是必需的。如果您只是使用完整参数列表扩展该类,那么B
中的n101 ... n200和A
中的n1 ... n100将具有getter和setter。这表明可能没有StylesheetB
扩展StylesheetA
,而是让B类的构造函数为B(StyleSheetA,StyleSheetB)
,这样你就可以在类A
中为它的参数设置一个setter,继承了这个内容,并在B
StylesheetB
中添加了{{1}}。