【问题标题】:Abstract Generics and List of abstract摘要泛型和摘要列表
【发布时间】:2012-12-07 19:26:13
【问题描述】:

我没有在现有问题中找到我的用例,所以我开始了。 我有一个具有这样的泛型的抽象类:

public abstract class aParameter<T>
{
    private T _parameter;

    public T Parameter
    {
        get { return _parameter;}
    }

    ...
}

然后我有这样的“类型”类:

public class IntParameter : aParameter<Int32>
{
    public IntParameter(Int32 value)
    {
        _parameter = value;
    }
}

 public class TextParameter : aParameter<String>
{
    public TextParameter(String value)
    {
        _parameter = value;
    }
}

现在在我的应用程序代码中,我想用抽象泛型类创建一个字典,而不指定泛型类型。像这样:

...
private Dictionary<Int32, aParameter> _paramDict = new Dictionary<Int32, aParameter>();
...

在以前的版本中,aParameter 使用接口而不是抽象类,但我想将其迁移到抽象,以便我可以简化我的“类型”类,而不是为每个“类型”重复相同的代码。

这里有什么想法吗?

编辑

我忘了提到它将是一个库的一部分,该库旨在在公司之间分发,所以我真的需要保护允许的类型。我不能只将objects 输入到我的代码中。

【问题讨论】:

    标签: c# .net-3.5


    【解决方案1】:

    泛型类型的目的是(除其他外)您只能编写一次可用于多种类型的代码。但是,由于 C# 是强类型,编译器需要知道它在泛型类中处理的类型。这就是为什么你必须指定泛型的类型(即尖括号中的类型) 如果您不指定泛型的类型,那么在您的示例中,编译器将不知道 Parameter 属性的类型。

    根据您的具体用途,有多种可能的方法:

    1. 使用Dictionary&lt;int, object&gt;。 读取值时,可以使用一堆 if/else 来检查对象的具体类型并转换为适当的类型。例如

      if(obj.GetType() == typeof(TextParameter)) { TextParameter p = obj 作为 TextParameter // 做东西 } 否则如果 obj.GetType() == typeof(IntParameter)) { IntParameter p = obj 作为 IntParameter // 做东西 }

    2. 有多个字典。 Dictionary&lt;int, TextParameter&gt;Dictionary&lt;int, IntParameter&gt;

    3. 如果 aParameter 中有不依赖于类型的方法/属性,则将它们移动到较低级别的非泛型抽象类。这可以为您提供至少一些功能,而无需求助于类型转换。

    【讨论】:

    • 我不能选择您的选项 1,因为 object 太笼统了,我不想要 if/else 垃圾。您的选项 2 也不可能,因为我不知道我的代码中输入了什么。您的选项 3 可能是最好的选择,我必须以某种方式弄清楚,但我受够了像地狱一样的铸造。
    【解决方案2】:

    你可能仍然需要非泛型接口(或如 Brandon 所说的非泛型抽象基类),除非你开始使用对象。

    原因是 aParameter&lt;String&gt;aParameter&lt;int32&gt; 不是同一类型,因此如果没有帮助,您将无法将它们放入一本字典中。

    我首选的方法是声明一个非泛型接口并将其用作字典的基础,然后在每个类型化泛型以及抽象基类中实现它。这样,您可以在可能的情况下从基类继承,或者如果您的一种类型需要从其他类型继承,则只需实现接口 - 您可以获得最大的灵活性。

    【讨论】:

    • 接口方式好像是我的选择。我仍然遇到问题,因为我需要界面中可用的public T Parameter。我尝试将其设置为public Object Parameter,但随后无法覆盖输出类型。我会看看我是否可以使用object 输出
    • 好的,我的object 属性的返回类型为object,结果很好。现在完成清理代码...
    • 您可以将接口返回对象作为参数返回类型,但仍然在泛型中具有更强的类型。
    • 怎么样?我试过了,但是当我尝试在抽象泛型类中将其键入为T Parameter 时,我大喊我没有正确实现接口Parameter...
    【解决方案3】:

    创建一个非泛型抽象基类并让你的泛型抽象类继承它。

    【讨论】:

    • 不错,但我更喜欢 Jon 的 interface 方式。
    • 是的,Jon 给了你两全其美 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多