抽象的继承 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
,但您可以为此添加其他字段。
我创建了以下摘要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
,但您可以为此添加其他字段。