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

时间:2016-02-24 08:22:40

标签: c# inheritance abstract-class

我创建了以下抽象类:

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

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

头等舱:

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

第二课:

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

我的代码中显示错误,属性值的类型不是object。我尝试使用new - 关键字代替override,如下所示:

在我的抽象类中:

public object Value { get; set; }

在我的派生类中:

public new FirstEnum Value { get; set; }

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

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

1 个答案:

答案 0 :(得分:7)

您可以像这样使用abstract类:

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

派生类会改变如下:

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>,则不是最干净的解决方案,但您可以拥有其他类:

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值。 Ofcorse,你不确切地知道它是enum,但你可以为此添加额外的字段。