首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在只有只读字段而没有太多参数的层次结构中设计构造函数?

如何在只有只读字段而没有太多参数的层次结构中设计构造函数?
EN

Stack Overflow用户
提问于 2010-09-20 22:36:13
回答 3查看 193关注 0票数 1

我设计了一个层次结构,每个类有2个只读属性映射到2个私有字段。

每个类都有一个cosntructor,它继承了父类。

问题是,在层次结构的每个级别上,参数的数量增加了2:

代码语言:javascript
复制
TBaseClass.Create (par1, par2);
TSubClass.Create(par1, par2, par3, par4);
TSubSubClass.Create(par1, par2, par3, par4, par5, par6);
[...]

有6-8个参数的构造函数可以吗?在创建之后,我的对象应该是不可变的,所以这就是为什么我尝试在构造函数中初始化所有的文件。

有没有其他你可以推荐的技术,或者我应该采用上面提到的方法?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-20 23:36:25

只要它们被很好地记录下来,我就不会对具有大量参数的函数有任何偏见。所以一个8参数的构造器不会吓到我。

但是,我可以看到在这里可能发生参数爆炸的地方,特别是当您开始为每个对象添加2个以上的属性时。如果其中一些参数可以是默认的/可选的,我还可以看到令人不快的构造函数重载的激增。

考虑到这一点,您可能希望通过使用构造模式来封装设置所有这些参数的复杂性。尽管FactoryPrototype可能也很有用,但我还是想到了Builder

票数 3
EN

Stack Overflow用户

发布于 2010-09-21 21:16:52

最好在可能的情况下坚持使用约定。生成器意味着一个顺序的或多个对象创建过程。抽象工厂更适合于从层次结构创建单个对象。

话虽如此,这种规律性确实看起来有点奇怪。SubClass3实际上需要全部6个属性,还是只需要两个?请记住,LSP - SubClass3应该完全替代BaseClass,因此在每个级别上,新的祖先都会承担整个集合的责任,这通常不仅仅是通过构造函数将它们传递回来。

票数 1
EN

Stack Overflow用户

发布于 2010-09-23 23:32:32

为什么不让这些属性是可写的,并通过将其强制转换为接口来保护对象呢?如下所示:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3752466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档