看,我知道静态类不能继承或实现。问题是“什么是是正确的C#+ OOP模式来实现这个?”。 “This”描述如下:如何在静态类中使用多态或继承?
我想为一组类定义和实现的通用集合,其中除一个类型之外的所有类型都应该是静态的。也就是说,我要做出一些武断基地转换器,其中每个具有完全相同的四个成员:
// Theoritical; static classes can't actually implement
interface IBaseConverter {
int Base { get; }
char[] Glyphs { get; }
int ToInt(string value);
string FromInt(int value);
}
// AND/OR (interface may be superfluous)
public class BaseConverter : IBaseConverter{
public BaseConverter(int Base, char[] Glyphs) {
this.Base = Base;
this.Glyphs = Glyphs;
}
public int Base { get; private set; }
public char[] Glyphs { get; private set;}
public int ToInt(string value) { // shared logic...
public string FromInt(int value) { // shared logic...
}
他们还可以共享基础上的Base
价值和字形的有序集合完全相同的实现逻辑。例如Base16Converter
可能有Base = 16
和glyphs = { '0', '1', ... 'E', 'F' }
。我相信FromInt
和ToInt
是不言自明的。显然,我不需要实现基于16的转换器,但是我需要为特定于行业的基础36(0
- Z
Code 39的字形)实现一个转换器。与内置的转换和字符串格式化功能(如[Convert]::ToInt32("123",16)
)一样,这些都是强调静态方法 - ,当基础和字形预先确定时。
我想保持可与任意的字形和底座,如被初始化实例的版本:
BaseConverter converter = new BaseConverter(7, new[]{ 'P', '!', 'U', '~', 'á', '9', ',' })
int anumber = converter.ToInt("~~!,U") // Equals 8325
但我也希望有一个静态类的Base36Code39Converter
。把这个的另一种方式是,任何static
实施者只是硬编码的基础和字形:
// Theoritical; static classes can't inherit
public static class Base36Code39Converter : BaseConverter {
private static char[] _glyphs = { '0', '1', ... 'Z' };
static Base36Code39Converter : base(36, _glyphs) { }
}
我明白为什么这不会对编译器的工作 - 没有虚函数表的静态方法和所有。我知道在C#中,静态类不能实现接口或从任何东西(除了对象)继承(请参见Why Doesn't C# Allow Static Methods to Implement an Interface?,Why can't I inherit static classes?)。
那么到底什么是是的“右”C#+ OOP模式来实现这个?
这不是[单件模式](http://www.dofactory.com/Patterns/PatternSingleton.aspx)的工作吗?另外,这里有一篇关于[Singleton VS Static Class](http://www.dotnetperls.com/singleton-static)的好文章。 – 2012-02-15 14:46:36