问题标签 [covariant]

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 投票
3 回答
4906 浏览

php - 将对象转换为其子类之一(协变返回类型)的正确 OO 方法是什么?

我有一个子类需要返回其父类的返回类型的子类。我相信这被称为协变返回类型。我想知道从父类转换为子类的最简单方法。

0 投票
1 回答
355 浏览

arrays - Ada 中的数组是协变的吗?

我知道在 Java 中数组是协变的。例如:

我的问题是 Ada Covariant 中的数组吗?

0 投票
1 回答
1435 浏览

c++ - C++ 覆盖成员变量 (std::vector)

这是我的问题所涉及的课程

首先,我想谈谈我解决的问题。他们可能会帮助他人。如果我是对的,你可以确认我^^

  1. 我可以覆盖具有不同返回类型的函数吗?
    Node* getNode(int index) 变成 TransformationNode* getNode(int index)

    是的,只要返回类型是协变的:http ://www.tolchz.net/?p=33

  2. 我可以覆盖成员吗?

    我不知道覆盖,但派生类中具有相同名称的变量将隐藏基类中的变量

还有一个问题,我真的很想解决一些问题

在 TransformationNode 类中,我做了很多(恕我直言)从基类到派生类的可避免类型转换。我绝对知道 mNodeList 向量中的所有元素都是 TransformationNodes 但要处理 mNodeList 我必须对它们进行类型转换。

继承是正确的,我的意思是 TransformationNode 是一个节点

mNodeList 包含节点的子节点,并且它不能在包含节点的类型转换版本的派生类中具有副本

最后,如果 static_cast 成本更高,我什至可以使用 reinterpered_cast。你能告诉我这些手术的费用吗?它们真的是很大的性能问题吗?
assert (dynamic_cast)... 已经采取了某种预防措施。



简要地说,我希望我的编译器知道 mGraph 实际上是一个 SceneGraph* 并且 mNodeList 包含 TransformationNode* 这有助于我避免丢失类型转换。


感谢您抽出宝贵时间

0 投票
3 回答
3585 浏览

c# - 传递可变数量的泛型类型参数

具体来说,我想编写一个可以像这样使用的导出函数:

我想到了类似下面的代码,但在这种情况下,我必须将所有内容都转换为“对象列表”,这不是我想要的。

你能给我一个提示如何优雅地解决这个问题吗?

0 投票
3 回答
1880 浏览

c++ - 具有非指针/引用返回类型的协变返回类型

我正在尝试在 C++(11) 中实现一个.NET 框架,如集合类。我的问题是无效的协变类型。我有这些课程:

在我看来,这太棒了。但是在 C++ 中实现它看起来是不可能的。我得到 g++ 的“无效协变返回类型”,据我所知,问题是 GetEnumerator 可能只返回一个指针或对 Enumerator 的引用,而不是 Enumerator 本身的对象。

我想避免返回这样的指针:

因为我不希望调用者打扰删除。使用临时对象,我可以确保该对象被自动删除,因为它不再需要了。使用引用可能会更糟。

我错过了什么吗?还是 C++ 标准(和语言)存在巨大漏洞?我真的很想实现这样的目标。

提前致谢。

0 投票
3 回答
672 浏览

java - Java 枚举中的协变返回类型

正如本网站上的另一个问题所述,这样的事情是不合法的:

这是由于协变返回类型显然不适用于枚举常量(再次打破枚举常量是枚举类型的单例子类的错觉......)那么,我们添加一些泛型怎么样:这合法吗?

在这里,所有三个返回Class对象,但单个常量比整个枚举类型“更具体”......

0 投票
1 回答
586 浏览

c++ - 具有多重继承的纯虚函数重载和协变返回类型

我必须修改我之前的问题。使用多重继承创建协变返回类型是否有任何限制?

下面的代码提出了问题。如果我们取消注释从 IDFPin 继承的类 IDFOutputPin,当我们尝试通过 IDFSourceNode 接口从 Source 类型的对象获取 IDFOutputPin 时,整个代码都会中断。质疑为什么会这样?我刚刚开始使用模板和这样的mixin,所以也许有一些限制,或者可能是编译器错误 - VS2010?

0 投票
4 回答
2329 浏览

c++ - 虚函数返回类型

我在一个基类中定义了一个纯虚函数 virtual int GetData() const = 0

在每个派生类中,我定义了一个枚举并尝试覆盖 GetData 函数返回(派生类特定枚举)值;

例如:

说我不能为所有类的所有枚举值定义相同的范围是非常重要的。上面的代码会产生编译错误:

任何建议 - 如何解决?

0 投票
1 回答
439 浏览

scala - Liskov 替换原则和数组不变性

Liskov 替换原则告诉我们,如果 A 是 B 的子类型,那么我们可以用类型 B 做的所有事情都应该能够用类型 A 做。

因此,为了进一步调查,我创建了以下内容:

我明白为什么我不允许这样做

因为数组在 Scala 中不是协变的(就像在 Java 中一样)。

但是,我认为我应该能够做到:

我希望 val b 没问题。但我得到:

0 投票
3 回答
15171 浏览

c++ - 嵌套类中的“无效协变返回类型”错误,方法返回基于模板的对象

以下 C++ 代码在编译时给了我这些错误:

我不想更改该行virtual Q<B> test() {}virtual Q<A> test() {}尽管它消除了编译错误。有没有其他方法可以解决这个问题?