问题标签 [covariance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
15438 浏览

c++ - C++ 协方差何时是最佳解决方案?

这个问题是几个小时前在这里提出的,让我意识到我从未在自己的代码中真正使用过协变返回类型。对于那些不确定协方差是什么的人,它允许(通常)虚函数的返回类型不同,前提是这些类型是相同继承层次结构的一部分。例如:

两个 f() 函数的不同返回类型被称为协变的。旧版本的 C++ 要求返回类型相同,因此 B 必须如下所示:

所以,我的问题是:有没有人有一个现实世界的例子,其中需要协变返回类型的虚函数,或者产生一个简单的返回基指针或引用的优越解决方案?

0 投票
2 回答
699 浏览

c# - 来自抽象方法的协变返回类型的问题

我正在尝试结束对抽象方法和返回类型协方差的两天抨击,我已经发布了两个类似的问题,我永远感谢社区提供的信息,我只需要最后一次推动即可终点线。这是我想要做的:2 个抽象类,RecruiterBase 和 CandidateBase,它们都有 RecruiterA 和 CandidateA 的 concreate 实现。RecruiterBase 有一个抽象方法可以让所有被招募的候选人返回 IQueryable。我的 RecruiterA 实现覆盖了 GetCandidates() 方法以返回 IQueryable。

和实现:

尝试编译会引发编译时错误,因为在我的 RecruitreBase 实现中,GetCandidates() 方法返回IQueryable<CandidateA>而不是IQueryable<CandidateBase>。

在无法从上一个问题(抽象/虚拟方法中的通用返回类型)中获得建议后,我做了很多阅读,并在 SO 中遇到了以下问题

如何在 C# 中子类的重写方法中返回子类型?

这最终让我意识到我一直在寻找的是一种为我的返回类型实现协方差的方法。我使用了 Marc Gravell 的片段......

...作为我解决方案的基础。所以现在我的 RecruiterBase 和 RecruiterA 类看起来像:

和我的实现......

我希望最终能得到我想要的东西,但我在以下代码中遇到了编译时错误,因为 GetCandidates() 无法将 CandidateA 隐式转换为 CandidateBase:

所以我添加了一个演员表:

然后一切都会编译,但是当我在控制器中实际调用 GetCandidates() 时,它会返回IQueryable<CandidateBase>而不是IQueryable<CandidateA>. 所以我回到了我开始的地方。

如果你能做到这一点并且你能帮助我,我会给你送 12 包你最喜欢的啤酒!

0 投票
4 回答
904 浏览

c# - 如何声明一个返回“任何东西”的通用集合的方法(C#)

我正在使用从抽象基类派生的通用集合类的层次结构来存储也从抽象基类派生的实体项:

此模型的目标是对从 CollectionBase<T> 派生的任何类的成员强制执行严格的类型规则,并保证这些成员具有默认的公共构造函数。到目前为止它有效。

现在我想创建一个工厂方法,它返回从 CollectionBase<T> 派生的类的实例。我知道通常的方法是:

... 或许 ...

但是,问题是调用例程不知道需要什么“T”。工厂方法本身必须确定要返回的特定集合类型。所以我需要一个非泛型方法签名,上面写着“返回类型将派生自 CollectionBase<T>”。我设想这样的事情(如果它是合法的)......

我认为这是另一个棘手的通用方差问题,但即使在阅读了 Eric Lippert 对该主题的广泛解释之后,我仍然不清楚我正在尝试做的事情在 C# 4.0 中是否可行,以及是否有一个简单的C# 3.0 中的解决方法。

提前感谢您的想法。

0 投票
2 回答
1381 浏览

c# - 可以转换 IQueryable到 IQueryable

我知道协方差,而且我知道通常在 v4.0 之前在 C# 中是不可能的。

但是我想知道一个具体的案例。是否有某种方法IQueryable<Derived>可以IQueryable<Base>通过某种方式创建一个实际上不执行查询但实际上可以“通过”.Where<>()调用的包装类来转换?

我的用例是我正在尝试处理具有许多相似表的数据库模式。大部分字段是通用的,很多通用字段需要在每张表上查询。我正在使用 LinqToSql。我希望避免重复每个表的所有查询。

0 投票
1 回答
731 浏览

c# - 如何在子类的抽象类中覆盖成员的类型

我有以下代码:

这会产生编译错误,我想知道我是否必须在 TestProperty 中使用泛型类型才能实现在子类中具有不同类型的同名目标?

0 投票
1 回答
834 浏览

math - 如何使用相关图估计方差?

从一本计算机模拟的书中,我得到了这两个方程。

替代文字

第一个是计算相关图,第二个是如何使用相关图估计方差。

估计观察方差的常用方法在计算机模拟中通常不是错误的,因为观察通常是相关的。

我的问题是,我从我的程序中计算出来的值非常大,所以它不可能是正确的。

我认为因为当 k 变大时 r[k] 会接近 0,所以第二个方程会给出一个很大的值,所以方程可能不正确?

正如你所问的,这是整个程序(用 Python 编写):

0 投票
4 回答
210 浏览

c# - 当您知道要分配的字段的名称时,可以将数组分配给未知类型的数组吗?

我需要将一个数组分配给一个字段。我不知道字段类型,但我确实引用了一个实例和字段的名称。我可以假设数组可以转换为字段类型。这可以做到吗?

巴斯

编辑:

希望这段代码能澄清我试图做什么,这会导致分配异常:

0 投票
5 回答
5326 浏览

c# - 了解 C# 4.0 中的协变和逆变

我在第 9 频道观看了有关它的视频,但我并没有真正理解它。

有人可以给我一个简单易懂的例子吗?在那之后,它可能会如何在实践中使用?

0 投票
4 回答
960 浏览

java - Java 是否有计划添加泛型集合协方差?

我试图编写一些看起来像这样的代码:

(ConcreteObject 实现 IObject 的地方)

这根本行不通。它给出了编译器错误。Java 是否有计划在未来支持此功能?在那之前最好的解决方法是什么?我最终做的是:

这行得通,也许这样做并没有任何不好的副作用。这是普遍接受的最佳方法吗?

0 投票
6 回答
2254 浏览

java - 是列表> 集合的一个实例>?

我编写了这个方便的通用函数,用于将集合集合转换为单个集合:

然后我试着叫它:

我收到以下错误:

现在 aList 是 a Collection, aString 是 a T。那么为什么这不起作用,我该如何解决呢?