从抽象类继承的静态类?

时间:2015-02-06 21:35:17

标签: c# oop inheritance abstract-class static-classes

所以我有一个A类。它定义了很多行为(方法),但也给子类留下了很多实现。这个类永远不会有实例。这只是定义所有子类共有的行为。 将要扩展A的子类(A1,A2,A3等)都将成为单例。我不希望这些子类有多个实例。

因此,显而易见的方法是创建一个抽象类A,然后创建扩展A的静态类A1,A2,A3。

但显然,C#中不允许这样做。我假设这是有充分理由的。微软的人可能比我更了解面向对象的软件设计。 但我只是需要一些帮助来弄清楚为什么这种设计“差”以及什么是另类更好的设计。


我正在使用WCF编写RESTful API。这个服务有一堆数据库表要执行CRUD操作。有很多代码对所有表都是通用的,而且很多代码都是特定于每个表的代码。此外,在任何给定时间只能对表执行一次操作。

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

3 个答案:

答案 0 :(得分: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 :(得分:2)

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

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

答案 2 :(得分: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;
        }
    }
}

这也将为您创建单身人士提供线程安全。