我创建了以下抽象类:
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,因为我会检索“错误”属性。它只是隐藏,但仍然存在,所以我必须覆盖该属性。
那么如何更改我的抽象类和派生类,我可以在派生类中使用不同的类型?
答案 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
,但你可以为此添加额外的字段。