gpt4 book ai didi

C# 用具体属性覆盖抽象属性

转载 作者:太空宇宙 更新时间:2023-11-03 19:45:45 25 4
gpt4 key购买 nike

所以我有这个抽象类。其中有一个抽象类型列表

public abstract class BaseClass
{

public abstract List<A> History { get; set; }

和继承类。

public class ConcreteClass : BaseClass
{
public override List<B> History { get; set; }

我的问题很简单。为什么这会返回错误。 A是b继承的抽象类。那么为什么我不能用具体属性覆盖抽象属性呢?

注意:由于其他问题,我不能对基类使用泛型。关于这个问题的一些澄清。我正在使用 mvc,由于动态类型的一些问题,我不能说 BaseClass<t>在其他一些领域,调用名为 GetHistory() 的方法的方法需要它返回具体列表而不是抽象列表。所以我进退两难。

最佳答案

Why does this return an error. A is an abstract class that B inherits.

再来一次。几乎每天都会有人问这个问题。

abstract class Fruit 
{
public virtual List<Fruit> M() { return new List<Fruit>(); }
}
class Apple : Fruit
{
public override List<Apple> M() { return new List<Apple>(); }
}

假设这是合法的。出了什么问题?

class Banana : Fruit { }

...

Fruit f = new Apple(); // Legal
List<Fruit> bowl = f.M(); // calls Apple.M, returns a list of apples.
bowl.Add(new Banana());

现在碗里有一根香蕉,里面可能只有苹果。

这就是为什么这一定是非法的。搜索covariance and contravariance 以了解这种转换在 C# 中何时合法以及何时非法。简而言之,只有当编译器可以证明它是安全的,并且类型参数是引用类型时,它才是合法的。

现在,这个怎么样?

abstract class Fruit 
{
public virtual Fruit N() { return new Banana(); }
}
class Apple : Fruit {
public override Apple N() { return new Apple(); }
}
...
Fruit f1 = new Apple();
Fruit f2 = f1.N(); // No problem, an apple is a fruit.

这不会破坏类型系统;这将是安全的,但它仍然是非法的。这是非法的,因为 虚拟返回类型协变 从未在 C# 中实现。它是用 C++ 实现的。

它尚未实现,因为它从来都不是 C# 团队的高优先级。十多年来,人们一直在要求它,但这并不是一个很棒的功能。也许它最终会完成;如果您对此有强烈的感觉,请加入 github 上的论坛并为它提倡。

关于C# 用具体属性覆盖抽象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45890124/

25 4 0
文章推荐: python - 运行 Holoview 和弦图示例时出错
文章推荐: javascript - 用不同的颜色切换每个
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com