c# - 如何在 C# 中访问其成员函数时防止调用一个类的构造函数?

标签 c# design-patterns constructor private

我有一个类 A 和一个类 AStore。我的要求是防止所有其他方法初始化类 A 的实例,它们应该从 AStore 获取实例。另外,我还需要从实例中访问A的成员函数。

工厂模式不适合这个问题,因为 A 的构造函数仍然是公共(public)的。理想情况下,在访问其成员函数的同时调用类 A 的构造函数时应该抛出编译错误。

我可以获得 C# 解决方案吗?

最佳答案

为了限制其他人创建类 A 的实例,您可以使用私有(private)构造函数和静态工厂方法来获取该类的实例。

public class A
{
  private A(){}

  public static A GetInstance()
  {
    return new A();
  }

  public void MemberFunctionOfA()
  {
  // blah blah...
  }
}

要强制仅通过 Astore 创建 A 的实例,您可以使用 protected 修饰符并从 A 派生 AStore。这样,只有 AStore 才能访问其 protected 成员,如“构造函数”或“工厂方法”:

public class Astore : A
{
    public A GetInstanceOfA()
    {
        return base.GetInstance();
    }
}

public class A
{
    protected A() { }

    protected A GetInstance()
    {
        return new A();
    }

    public void MemberFunctionOfA()
    {
        // blah blah...
    }
}

//Usage
public class ConsumerClass
{
    public void Test()
    {
        var a = new A(); // Compile error
        a = new Astore().GetInstanceOfA();
        a.MemberFunctionOfA();
    }
}

但是另一个类“UnWantedStore”仍然有可能派生自 A 并提供 A 的实例。

关于c# - 如何在 C# 中访问其成员函数时防止调用一个类的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41984648/

相关文章:

c# - MVVM 轻型从 ViewModel 发送消息到 View

java - Java 中正确的 MVC 实现

java - 抽象工厂如何使用委托(delegate)

c# - 一个属性返回另一个类的成员而不是在构造函数中设置属性有什么好处吗?

java - 是否正在创建一个私有(private)构造函数来测试不良做法?

c# - 构造函数是否可以包含确定调用哪个其他构造函数覆盖的逻辑?

c# - Fabric 消息太大

c# - 分页以返回总计数和总页数

c# - 我如何将 Activator.CreateInstance 与字符串一起使用?

design-patterns - 我什么时候需要停止使用设计模式?