【发布时间】:2012-03-06 21:54:21
【问题描述】:
看,我知道静态类不能继承或实现。问题是“到底是什么是正确的 C# + OOP 模式来实现这个?”。 “这个”描述如下:
我想为一组类定义一组通用的定义和实现,其中除了一个类型之外的所有类都应该是静态的。也就是说,我想制作一些任意的基本转换器,每个基本转换器都有完全相同的四个成员:
// 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) { }
}
我明白为什么这对编译器不起作用——没有用于静态方法的 vtable 等等。我知道在 C# 中,静态类不能实现接口或从任何东西(对象除外)继承(参见Why Doesn't C# Allow Static Methods to Implement an Interface?、Why can't I inherit static classes?)。
那么是实现这个的“正确”C# + OOP 模式是什么?
【问题讨论】:
-
这不是singleton pattern 的作品吗?另外,这里有一篇关于Singleton VS Static Class 的好文章。
标签: c# static polymorphism