gpt4 book ai didi

c# - 抽象类的继承使用不同于为属性定义的类型

转载 作者:太空狗 更新时间:2023-10-30 00:39:26 26 4
gpt4 key购买 nike

我创建了以下抽象类:

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,因为我会检索到“错误”的属性。它只是隐藏了,但仍然存在,所以我必须覆盖该属性。

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

最佳答案

您可以使用 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> ,但你可以有额外的类(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值(value)。当然,您不会确切地知道哪个 enum是的,但您可以为此添加其他字段。

关于c# - 抽象类的继承使用不同于为属性定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35596808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com