防止类被实例化

时间:2016-03-10 11:07:08

标签: c# .net winforms

您好我想要一个无法实例化的类但可以作为静态字段添加到另一个类但我无法实现它;

这是我所做的;

    public class ValueListManager
    {
        public static Operations myOps { get { return new Ops(); } }         
    }

    public interface Operations
    {
        void Call();
    }

    public class Ops : Operations
    { 

        public void Call()
        {

        }
    }

我不会'希望Ops类在其他地方实例化。基本上我希望能够;

    ValueListManager.Operations.Call();

但我不希望能够使用ops类;

    var ops = new Ops();

有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:6)

您可以通过将Ops类声明为要在其中使用它的ValueListManager类中的私有类来实现此目的:

{{1}}

请注意,在此示例中,基于您的代码,每次访问myOps属性时都会创建一个新的Ops类实例。如果您不想这样做,则需要在创建Ops实例后将其存储在静态字段中,并在属性的Getter中使用它。

答案 1 :(得分:5)

据我了解,您希望仅将该类实例化一次,然后再使用它

您可以使用 Singletone模式,也可以将继承与此模式一起使用。

public class Ops: Operations
{
   private static Ops instance;

   private Ops() {}

   public static Ops Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Ops();
         }
         return instance;
      }
   }

 public void Call()
 {
   // do something
 }
}

你想在哪里使用它,你可以调用它的方法:

Ops.Instance.Call()

答案 2 :(得分:1)

如果你不想出于某种原因嵌套你的类,并且不想基本上改变除Ops类本身之外的任何东西,你可以将你的代码放到另一个程序集中(添加一个类库到你的解决方案),并使构造函数internal

public class ValueListManager
{
  public static Operations myOps { get { return new Ops(); } }         
}

public class Ops : Operations
{ 
  internal Ops() {}
  public void Call()
  {
  }
}

然后你只需要从你想要使用的程序集添加对该程序集的引用,你不需要更改任何其他代码。

构造函数(因此new Ops())只能从该程序集访问,其他程序集中的代码将无法new

答案 3 :(得分:1)

这与设计模式单例非常相似,但是如果您只想要一个实例或者您不希望从其他地方实例化它,那么您的代码就不清楚了吗?

如果它是单个实例,那么在c#中使用静态构造函数实现单例的最佳推荐方法之后:

PyPDF2

大多数其他方式都存在线程问题的风险(至少是理论上的)。

然而,应该注意的是,单一模式(通常广泛使用静态方法)在某些情况下表明设计不良。