0

私は C# の初心者ですが、C++ の知識はかなりあります。C ++から、次のようなものが機能することに慣れています:

class Base1 {};
class Derived1 : Base1 {};
class Base2 {
   Base1 foo();
};
class Derived2 {
   Derived1 foo();
};

これは、共分散という用語で知っています。コードの一部が欠けている可能性がありますが、私の言いたいことが理解できることを願っています。オーバーライドなどを使用して C# でそのようなものを作成しようとすると、コンパイラは型が同じでなければならないと不平を言いました。このような:

class Base1 {};
class Derived1 : Base1 {};
class Base2 {
   Base1 foo();
};
class Derived2 {
   Base1 foo();
};

それは何か問題を引き起こす可能性がありますか?もちろん、私は関数 foo のプログラマーなので、常に Derived1 が返されることを保証できます。しかし、私の関数を呼び出す人は誰でもそれを知りません。

私はいくつかの Manager クラスを含むプロジェクトを持っています。そのために Interface IManager を使用したかったのです (それは私自身のクラスであり、その名前のものが存在する場合は .NET からのものではありません)。それらはすべてメソッド Load を実装する必要があるためです。 () 例えば。Load() は常に、特定の Manager によって管理されるオブジェクトを返します。すべての Manager が IManager を実装する場合、すべての Manager が Interface を取得します。

ManagableObject Load();

それは良いですか、悪いですか?またはさらに良いことに、回避策はありますか?

テンプレートで機能することも読みましたが、これだけだと思います:

List<Base1> myList;
myList.push_back(new Derived1());

または、Base1 の戻り値の型として List を使用し、クラス Derived2 の List を使用できますか? それもいいでしょう。

よろしくお願いいたします。

4

2 に答える 2

0

new キーワードを使用してメソッドを宣言する必要があります。

 class Derived2 {
  new Derived1 foo();
};
于 2012-07-23T05:16:41.987 に答える
0

つまり、C# は戻り値の型の共分散をサポートしていますか? しかし、戻り値の型の共分散という用語を探す方法を知りませんでした

于 2012-07-25T16:48:47.550 に答える