抽象的继承 class 使用了为 属性 定义的另一种类型

Inheritance of abstract class use another Type than defined for property

我创建了以下摘要class:

public abstract class AbstractClass
{
    public abstract string Name { get; set; }
    public abstract object Value { get; set; }
}

现在我想导出两个class摘要class。我想使用 enum 而不是类型 object。我派生的 classes 看起来像这样:

第一个class:

public class InheritanceClass1:AbstractClass
{
    public override string Name { get; set; }
    public override FirstEnum Value { get; set; }
}

第二个class:

public class InheritanceClass2 : AbstractClass
{
    public override string Name { get; set; }
    public override SecondEnum Value { get; set; }
}

我的代码中显示错误,属性 值的类型不是 object。我尝试使用 new-关键字而不是像这样的 override

在我的摘要中 class:

public object Value { get; set; }

在我导出的class:

public new FirstEnum Value { get; set; }

但是,如果我创建一个 List<AbstractClass>,我会遇到无法将其用于 Linq 的问题,因为我会检索 "wrong" 属性。它只是隐藏了,但仍然存在,所以我必须覆盖 属性.

那么我该如何更改我的抽象 class 和派生的 classes,以便我可以在派生的 classes 中使用不同的类型?

您可以这样使用 abstract class:

public abstract class AbstractClass<T>
{
    public abstract string Name { get; set; }
    public abstract T Value { get; set; }
}

而导出的class会变成这样:

public class InheritanceClass1 : AbstractClass<FirstEnum>
{
    public override string Name { get; set; }
    public override FirstEnum Value { get; set; }
}

如果您知道您只需要 enums,您可以将 struct, IConvertible 限制添加到 T:

public abstract class AbstractClass<T> where T : struct, IConvertible
{
    public abstract string Name { get; set; }
    public abstract T Value { get; set; }
}

根据评论更新

如果你需要 List<AbstractClass>,这不是最干净的解决方案,但你可以有额外的 class:

public abstract class AbstractClass
{
    public abstract string Name { get; set; }
    public abstract int GetValue ();
}

然后将由 AbstractClass<T>:

继承
public abstract class AbstractClass<T> : AbstractClass where T : struct, IConvertible
{
    public abstract T Value { get; set; }
}

InheritancClass

public class InheritanceClass1 : AbstractClass<FirstEnum>
{
    public override string Name { get; set; }
    public override FirstEnum Value { get; set; }

    public override int GetValue () => (int)Value;
}

然后你可以在列表中使用它:

var list = new List<AbstractClass> { new InheritanceClass1 (), new InheritanceClass2 () };

通过这种方式,您可以使用 List<AbstractClass>GetValue 方法。如果您只使用 enums,您可以随时将其重铸为 enum 值。当然,您不会确切知道它是哪个 enum,但您可以为此添加其他字段。