C# 如何在静态类中使用多态性或继承?

C# 如何在静态类中使用多态性或继承?,c#,static,polymorphism,C#,Static,Polymorphism,听着,我知道静态类不能继承或实现。问题是“到底什么是正确的C#+OOP模式来实现这个?”。“这”描述如下: 我想为一组类定义一组通用的定义和实现,在这些类中,除了一种类型之外,所有类型都应该是静态的。也就是说,我想制作一些任意的基极转换器,其中每个转换器都有完全相同的四个成员: // Theoritical; static classes can't actually implement interface IBaseConverter { int Base { get; }

听着,我知道静态类不能继承或实现。问题是“到底什么是正确的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
是不言自明的。显然,我不需要为base 16实现转换器,但我确实需要为特定于行业的base 36实现一个转换器(的
0
-
Z
glyphs)。与内置的转换和字符串格式功能一样,如
[Convert]::ToInt32(“123”,16)
,这些都是静态方法——当基符号和glyph是预先确定的时候

我想保留一个可以用任意标志符号和基进行初始化的实例版本,例如:

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#中,静态类不能实现接口或继承任何东西(对象除外)(参见)


那么,实现这一点的“正确”C#+OOP模式究竟是什么呢?

为什么要将其设置为静态


似乎就是你要找的东西。

你可以随时使用构图。在这种情况下,您的静态类将具有相应转换器的实例,并仅代理对该转换器的任何调用:

public static class Base36Code39Converter
{
    private static BaseConverter _conv = 
        new BaseConverter(36, new[]{ '0', '1', ... 'Z' });

    public static int ToInt(string val)
    {
        return _conv.ToInt(val);
    }
}

你要去的方向。。。这不是个好主意

我建议您仿效

它具有类型编码的公共静态属性,这些属性是不同类型文本编码的编码类的标准实现

  • ASCII码
    • 获取ASCII(7位)字符集的编码
  • 双端码
    • 获取使用big-endian字节顺序的UTF-16格式的编码
  • 默认值
    • 获取操作系统当前ANSI代码页的编码
  • Unicode
    • 获取使用小尾端字节顺序的UTF-16格式的编码
  • UTF32
    • 获取使用小尾端字节顺序的UTF-32格式的编码
  • UTF7
    • 获取UTF-7格式的编码
  • UTF8
    • 获取UTF-8格式的编码
在您的例子中,您将提供一个抽象基类,而不是一个接口,并将您的公共实现公开为静态属性


然后,开发人员就可以轻松访问您提供的通用转换器的实现,或者他们也可以实现自己的转换器。

答案是单例模式。例如,见


路易吉·门多萨(Luiggi Mendoza)提供了这个答案,我将其标记为答案,但出于某种原因,他删除了这个答案。我重新发布它是为了完整性。

+1-虽然Luiggi提供了直接的答案,并提供了一个清晰的理论解释链接,但这是BCL中使用的模式的一个很好的例子。@jmh_gr:嗯,其实不一样。但无论如何,你都明白了。在这种情况下,查看类似模式的框架总是很好的,因为它们都经过了合理的考虑,并且对所有使用BCL的开发人员都很熟悉。尽管singleton设计模式是我一直在寻找的模式(如Luiggi所指出的),您到Wikipedia消歧页面的链接更多地说明了这个术语令人困惑的原因:它还意味着一组一,这也是在.NET4.0+中作为元组实现的。MDSN本身既有描述的文档,也有描述为“1元组或单元组”的文档?另外,这里有一篇关于的好文章。感谢您在这里提供完整性。