所以我有一个A类。它定义了很多行为(方法),但也给子类留下了很多实现。这个类永远不会有实例。这只是定义所有子类共有的行为。 将要扩展A的子类(A1,A2,A3等)都将成为单例。我不希望这些子类有多个实例。
因此,显而易见的方法是创建一个抽象类A,然后创建扩展A的静态类A1,A2,A3。
但显然,C#中不允许这样做。我假设这是有充分理由的。微软的人可能比我更了解面向对象的软件设计。 但我只是需要一些帮助来弄清楚为什么这种设计“差”以及什么是另类更好的设计。
我正在使用WCF编写RESTful API。这个服务有一堆数据库表要执行CRUD操作。有很多代码对所有表都是通用的,而且很多代码都是特定于每个表的代码。此外,在任何给定时间只能对表执行一次操作。
所以我想我可以有一个抽象类TableHandler
。然后是它的多个扩展,例如TableAHandler
,TableBHandler
等等。因为我只想要这些子类的一个实例,所以我想让它们变为静态。
答案 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;
}
}
}
这也将为您创建单身人士提供线程安全。