我设计了一个层次结构,每个类有2个只读属性映射到2个私有字段。
每个类都有一个cosntructor,它继承了父类。
问题是,在层次结构的每个级别上,参数的数量增加了2:
TBaseClass.Create (par1, par2);
TSubClass.Create(par1, par2, par3, par4);
TSubSubClass.Create(par1, par2, par3, par4, par5, par6);
[...]有6-8个参数的构造函数可以吗?在创建之后,我的对象应该是不可变的,所以这就是为什么我尝试在构造函数中初始化所有的文件。
有没有其他你可以推荐的技术,或者我应该采用上面提到的方法?谢谢。
发布于 2010-09-20 23:36:25
只要它们被很好地记录下来,我就不会对具有大量参数的函数有任何偏见。所以一个8参数的构造器不会吓到我。
但是,我可以看到在这里可能发生参数爆炸的地方,特别是当您开始为每个对象添加2个以上的属性时。如果其中一些参数可以是默认的/可选的,我还可以看到令人不快的构造函数重载的激增。
考虑到这一点,您可能希望通过使用构造模式来封装设置所有这些参数的复杂性。尽管Factory或Prototype可能也很有用,但我还是想到了Builder。
发布于 2010-09-21 21:16:52
最好在可能的情况下坚持使用约定。生成器意味着一个顺序的或多个对象创建过程。抽象工厂更适合于从层次结构创建单个对象。
话虽如此,这种规律性确实看起来有点奇怪。SubClass3实际上需要全部6个属性,还是只需要两个?请记住,LSP - SubClass3应该完全替代BaseClass,因此在每个级别上,新的祖先都会承担整个集合的责任,这通常不仅仅是通过构造函数将它们传递回来。
发布于 2010-09-23 23:32:32
为什么不让这些属性是可写的,并通过将其强制转换为接口来保护对象呢?如下所示:
type
IMyObject = interface
function GetProperty1(): integer;
function GetProperty2(): boolean;
end;
TMyObject = class(TInterfacedObject, IMyObject)
public
constructor Create();
function GetProperty1(): integer;
function GetProperty2(): boolean;
procedure SetProperty1(Value: integer);
procedure SetProperty2(Value: boolean);
end;
function CreateMyObject: IMyObject;
var obj: TMyObject
begin
obj := TMyObject.Create;
obj.SetProperty1(45);
obj.SetProperty2(false);
Result := obj;
end;https://stackoverflow.com/questions/3752466
复制相似问题