没有协方差,继承怎么可能是合理的?(C#) 我对C语言很陌生,但我有很好的C++知识。从C++中,我使用了这样的工作: class Base1 {}; class Derived1 : Base1 {}; class Base2 { Base1 foo(); }; class Derived2 { Derived1 foo(); };

没有协方差,继承怎么可能是合理的?(C#) 我对C语言很陌生,但我有很好的C++知识。从C++中,我使用了这样的工作: class Base1 {}; class Derived1 : Base1 {}; class Base2 { Base1 foo(); }; class Derived2 { Derived1 foo(); };,c#,inheritance,covariance,C#,Inheritance,Covariance,我在协方差项下知道。这段代码可能会漏掉一些东西,但我希望你明白我想说的。 当我试图在C#中生成类似的东西时,使用了覆盖之类的东西,编译器抱怨类型必须相同。像这样: class Base1 {}; class Derived1 : Base1 {}; class Base2 { Base1 foo(); }; class Derived2 { Base1 foo(); }; 这会导致任何问题吗? 当然,由于我是函数foo的程序员,我可以保证总会有一个Derived1返回。但是调用我函

我在协方差项下知道。这段代码可能会漏掉一些东西,但我希望你明白我想说的。 当我试图在C#中生成类似的东西时,使用了覆盖之类的东西,编译器抱怨类型必须相同。像这样:

class Base1 {};
class Derived1 : Base1 {};
class Base2 {
   Base1 foo();
};
class Derived2 {
   Base1 foo();
};
这会导致任何问题吗? 当然,由于我是函数foo的程序员,我可以保证总会有一个Derived1返回。但是调用我函数的人不知道这一点

我有一个项目,其中有一些管理器类,我想为其使用接口IManager(这是我自己的类,如果存在具有该名称的类,则不是任何来自.NET的类),因为它们都必须实现方法Load(),例如。Load()总是返回一个由某个管理器管理的对象。 如果每个管理器都实现IManager,那么所有管理器都将获得该接口

ManagableObject Load();
这是好的还是坏的?或者更好的是,有什么解决办法吗

我还读到它与模板一起工作,但我猜只有这样:

List<Base1> myList;
myList.push_back(new Derived1());
列出myList;
myList.push_back(新派生1());
或者我可以在Base1中使用List作为返回类型,在Derived2类中使用List作为返回类型吗?那也可以

谢谢并致以最良好的祝愿,
Expecto

您需要使用new关键字声明您的方法

 class Derived2 {
  new Derived1 foo();
};

这就是我的意思:但我不知道如何查找术语返回类型协方差

您的第一组类定义没有任何错误(除了需要方法实现),因此我认为您的解释中可能遗漏了一些东西。你会得到什么编译器错误?C#实际上在不同的地方支持协方差;但是,不支持协变返回值,我相信这正是您在这里所追求的。在显示实际问题方面,您的示例目前也有问题。@RJLohan在英语中的意思是:“返回值必须是ManagableObject,才能与覆盖的方法IManager.Load()匹配。”@cwan是的,我是指返回值,但我想我已经说清楚了,Sorry使用新修饰符显式隐藏从基类继承的成员。要隐藏继承的成员,请使用相同的名称在派生类中声明它,然后使用新的修饰符对其进行修改。()当类基类{void test(){}}派生类时使用:基类{new void test(){}(new仅用于隐藏基类方法,没有new关键字),编译器仅生成警告消息,但代码是可编译和可执行的)