2015-02-06 168 views
0

所以我有一个类A.它定义了很多的行为(方法),但也留下很多的子类来实现。这个类永远不会有一个实例。这只是要定义所有子类通用的行为。 要扩展A的子类(A1,A2,A3等)都将是单例。我不希望这些子类有多个实例。从抽象类继承的静态类?

那么明显的方式做这将是创建一个抽象类A,然后静态类A1,A2,A3,扩展A.

但很显然,这不是在C#中允许的。我假设有一个很好的理由。微软的人可能比我更了解更多关于面向对象的软件设计。 但我只是需要一些帮助,找出为什么这个设计是“穷”,什么会是一个替代更好的设计。


我正在写使用WCF一个RESTful API。有一堆数据库表,这个服务将在其上执行CRUD操作。有很多代码对于所有表格都是通用的,并且很多代码将会针对每个表格。而且,在任何给定时间只能在桌子上执行一个操作。

所以我想我可以有一个抽象类TableHandler。然后它的多个扩展如TableAHandler,TableBHandler等。因为我只想要这些子类的一个实例,所以我想让它们成为静态的。

+4

这是不允许的,因为继承是关于创建相关的对象类,而且你根本没有用静态类创建任何对象。告诉我们你想要解决什么现实世界的问题,我们会看看我们是否可以提出解决方案。 – 2015-02-06 21:38:38

+0

@RobertHarvey我添加了一些关于我试图解决的问题的信息。谢谢。 – AyushISM 2015-02-06 21:55:07

+0

使用[工厂方法](http://en.wikipedia.org/wiki/Factory_method_pattern)模式。如果你喜欢,使工厂方法单例服务的对象。 – 2015-02-06 21:55:53

回答

2

创建一个扩展您的基的普通类,但遵循具有私有构造函数和静态访问器的单例模式到实例。

abstract class A { } 

class A1 : A 
{ 
    private static A1 instance; 
    public static A1 Instance 
    { 
     get 
     { 
      if(instance == null) 
       instance = new A1(); 
      return instance; 
     } 
    } 

    private A1() { } 
} 

正如@ScottChamberlain指出,此实现不是线程安全的。使用静态构造函数将使初始化线程安全。在这个问题中可以找到更多信息:Is the C# static constructor thread safe?

+1

是的,基本上这个问题并不需要不可能的静态类,因为通常如何设置单例模式(如此答案所示) – ryanyuyu 2015-02-06 21:42:10

+0

这不是一个非常安全的单例模式。如果多个线程在初始化阶段同时调用属性,则可能会存在多个'A1'副本。静态方法和属性应始终设法保证线程安全。 – 2015-02-06 22:19:57

2

继承是影响对象的东西。根据定义,静态类不允许实例化。因此,他们不能参与继承。

实际上,静态方法不能是虚拟的,这几乎消除了能够声明继承的静态类的任何可能的用处。定义Singleton模式

0

简单的方法是Lazy<T>

public abstract class A { } 

public class B : A 
{ 
    private static Lazy<B> _instance = new Lazy<B>(() => new B()); 

    private B() { } 

    public static B Instance 
    { 
     get 
     { 
      return _instance.Value; 
     } 
    } 
} 

这也将提供线程安全,创造你的单身人士。