gpt4 book ai didi

c# - 在不限制构造函数访问的情况下控制对象的实例化

转载 作者:行者123 更新时间:2023-11-30 13:58:08 25 4
gpt4 key购买 nike

当我们想要控制对象的实例化时,我们经常将构造函数设为私有(private)或内部:

public class A {
private A(int aParam) { }
}

但是,这在本质上与密封类“A”相同,因为现在没有人可以继承它。

因此,我们可以使构造函数 protected :

public class A {
protected A(int aParam) { }
}
public class B {
protected B(int aParam) : base(aParam) { }
}

但是,这意味着来自 B 的任何代码(或任何派生自它的类)都可以实例化一个新的 A。

我正在寻找一种方法来控制实例化,但不必使类密封(有效或其他方式)。

注意:我知道类总是可以通过反射和其他技巧实例化;我只对创建一个明确的“契约(Contract)”感兴趣。如果有人想故意破坏我的契约(Contract),那是他们的事。

最佳答案

I am looking for a way to control instantiation but without having to make classes sealed (effectively or otherwise).

这在你的要求中确实是自相矛盾的。

如果要允许创建子类,您必须允许子类有效地创建父类,这意味着您至少需要有一个 protected 构造函数。否则,子类将无法正确初始化实例。

通过将构造函数公开为 protected ,您允许子类更改实例化规则(它们始终可以添加公共(public)构造函数)。

这里实际上只有两个选项:

  1. 使构造函数 protected ,并假设子类会做“正确的事情”(无论您的场景是什么),或者
  2. 密封你的类,然后公开你选择的构造方法。这会阻止子类,但不会阻止您的类通过组合而不是继承被重用。

关于c# - 在不限制构造函数访问的情况下控制对象的实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18215384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com