gpt4 book ai didi

c# - 子类型和协变返回类型

转载 作者:行者123 更新时间:2023-11-30 19:12:03 25 4
gpt4 key购买 nike

我找到了解释 What is a covariant return type?但我并不聪明,无法理解这一切。

我认为 Covariant 返回类型理论上是一个函数返回的类型,该函数具有与返回类型不同的内置基类函数相同的签名。

class Base{
TypeX func( int i ){return typex;} // builtin function
};
class Derived:Base{
TypeY func(int i){return typey;}
}

我对这种所谓的协变返回类型的理解是否正确? [这个词真的让我感到困惑。]

最佳答案

这将是协变返回类型的示例:

class Food {}
class Fruit : Food {}
class FoodEater
{
public virtual Food GetFavouriteFood() { ... }
}
class FruitEater : FoodEater
{
public override Fruit GetFavouriteFood() { ... }
}

在支持返回类型协变的语言中,这是合法的。也就是说,返回 Food 的方法可以被返回 Fruit 的方法覆盖,因为 Fruit 是一种 Food。之所以称为“协方差”,是因为“方差”在同一方向:

A Fruit may be used as a Food, therefore:
A Fruit-returning-method may be used as a Food-returning-method

看看方差如何在同一方向

与参数类型逆变对比:

class Food {}
class Fruit : Food {}
class Apple : Fruit {}
class Orange : Fruit {}
class Cake : Food {}
class FruitComparer
{
public virtual bool Compare(Fruit f1, Fruit f2) { ... }
}
class FoodComparer : FruitComparer
{
public override bool Compare(Food f1, Food f2) { ... }
}

FruitComparer 可以比较苹果和橙子。 FoodComparer 还可以将苹果与橙子进行比较,但可以进行更多的比较——它可以将苹果与蛋糕进行比较,或者将蛋糕与橙子进行比较,等等。

在支持参数类型逆变的语言中,这是合法的。查看方差方向现在如何反转:

A Fruit may be used as a Food, therefore
A Food-taking-method may be used as a Fruit-taking-method

现在关系已经倒退,所以它是逆变

C# 不支持虚拟重载 的任何一种方法变体。虚拟方法覆盖必须完全匹配。但是,对于委托(delegate)转换的方法组通用委托(delegate)类型转换,C# 确实支持这两种方法变体。

关于c# - 子类型和协变返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8990948/

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