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