gpt4 book ai didi

c# - 如何在静态类中使用多态或继承?

转载 作者:行者123 更新时间:2023-11-30 14:15:48 24 4
gpt4 key购买 nike

看,我知道静态类不能继承或实现。问题是“什么是正确的 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 = 16glyphs = { '0', '1', ... 'E', 'F' }。我相信 FromIntToInt 是不言自明的。显然我不需要为 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

但是我还想要一个Base36Code39Converterstatic 类。另一种表达方式是任何 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# 中,静态类不能实现接口(interface)或从任何东西(对象除外)继承(参见 Why Doesn't C# Allow Static Methods to Implement an Interface?Why can't I inherit static classes?)。

那么 到底什么是“正确的”C# + OOP 模式来实现它?

最佳答案

你前进的方向......不是一个好主意。

我建议您效仿 System.Text.Encoding 呈现的模式.

它具有 Encoding 类型的公共(public)静态属性,这些属性是用于不同类型文本编码的 Encoding 类的标准实现。

  • ASCII
    • 获取 ASCII(7 位)字符集的编码。
  • BigEndianUnicode
    • 获取使用大端字节顺序的 UTF-16 格式的编码。
  • 默认
    • 获取操作系统当前 ANSI 代码页的编码。
  • 统一码
    • 使用小端字节顺序获取 UTF-16 格式的编码。
  • UTF32
    • 使用小端字节顺序获取 UTF-32 格式的编码。
  • UTF7
    • 获取 UTF-7 格式的编码。
  • UTF8
    • 获取 UTF-8 格式的编码。

在您的情况下,您将提供一个抽象基类,而不是一个接口(interface),并将您的通用实现公开为静态属性。

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

关于c# - 如何在静态类中使用多态或继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9295383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com