抽象类的继承使用另一个不是为property定义的Type

dan*_*l59 4 c# inheritance abstract-class

我创建了以下抽象类:

public abstract class AbstractClass
{
    public abstract string Name { get; set; }
    public abstract object Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在我想派生两个抽象类的类.我想使用enum而不是类型object.我的派生类看起来像这样:

头等舱:

public class InheritanceClass1:AbstractClass
{
    public override string Name { get; set; }
    public override FirstEnum Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

二等:

public class InheritanceClass2 : AbstractClass
{
    public override string Name { get; set; }
    public override SecondEnum Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的代码中显示错误,属性值的类型不是object.我试着使用new-keyword而不是override像这样:

在我的抽象类中:

public object Value { get; set; }
Run Code Online (Sandbox Code Playgroud)

在我的派生类中:

public new FirstEnum Value { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是,如果我创建了一个List<AbstractClass>我有问题,我不能使用它为例如Linq,因为我会检索"错误"属性.它只是隐藏,但仍然存在,所以我必须覆盖该属性.

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

Dov*_*opa 7

你可以使用这样的abstract类:

public abstract class AbstractClass<T>
{
    public abstract string Name { get; set; }
    public abstract T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

派生类将改变如下:

public class InheritanceClass1 : AbstractClass<FirstEnum>
{
    public override string Name { get; set; }
    public override FirstEnum Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果您知道自己只需要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; }
}
Run Code Online (Sandbox Code Playgroud)

根据评论更新:

如果您需要List<AbstractClass>,这不是最干净的解决方案,但您可以拥有其他课程:

public abstract class AbstractClass
{
    public abstract string Name { get; set; }
    public abstract int GetValue ();
}
Run Code Online (Sandbox Code Playgroud)

然后将由以下内容继承AbstractClass<T>:

public abstract class AbstractClass<T> : AbstractClass where T : struct, IConvertible
{
    public abstract T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

而且InheritancClass:

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

    public override int GetValue () => (int)Value;
}
Run Code Online (Sandbox Code Playgroud)

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

var list = new List<AbstractClass> { new InheritanceClass1 (), new InheritanceClass2 () };
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以使用List<AbstractClass>GetValue方法.如果您只使用,enums您可以随时重新定价enum.Ofcorse,你不会确切地知道enum它是什么,但你可以为此添加额外的字段.

  • 但值得注意的是,现在你将无法拥有`List <AbstractClass>.你当然可以有一个`List <AbstractClass <FirstEnum >>`或`List <InheritanceClass1>`但这可能不是他们首先有一个`List <AbstractClass>`的原因. (3认同)