あなたはこのようIBusinessModel
共変を定義する必要があります。
public interface IBusinessModel<out T>
{
//...
}
それが動作します。
共分散
最初に指定したよりも派生型を使用できるようにします。
いつもと同じように、メインreferenceを参照すると完全な説明が得られます。 OPの例に基づいて
さらなる説明:
同じページに取得するには、
abstract class BusinessObject : ObservableObject, IBusinessObject { }
class ObservableObject { }
interface IBusinessObject { }
abstract class BusinessModel<T> : IBusinessModel<T> where T : IBusinessObject { }
interface IBusinessModel<out T> { } //This change should be made as suggested in my answer
class User : BusinessObject { }
class UserModel : BusinessModel<User> { }
のは、最初の(宣言のいくつかは疑問で提示されていないとして)私たちはクラスやインタフェースのためにこれらの定義を持っていると仮定しましょう
今、次の課題はどうなりますか?
IBusinessModel<IBusinessObject> v = new UserModel();
BusinessObject
(即ちUser
)のサブクラスであるIBusinessObject
の実装は、IBusinessObject
の代わりに使用されています。
IBusinessModel
の代わりにIBusinessModel
(つまりBusinessModel
)の実装が使用されます。
我々はすでに我々がBusinessModel
の番目の定義でIBusinessObject
の任意のインスタンスを使用することができると述べているので、1が何らかの問題が発生しない場合:(
abstract class BusinessModel<T> : IBusinessModel<T> where T : IBusinessObject { }
2が反変であることをIBusinessModel
を必要とする場合前に引用した定義に基づく):
interface IBusinessModel<out T> { } //This change should be made as suggested in my answer
出典
2017-04-20 23:14:37
mok
クラスには分散がないため、共分散と反共を調べる。これは確かに重複している、私は誰かがこれを閉じるために一致する質問を見つけることを願っています。 – dasblinkenlight
質問にIBusinessModelまたはIBusinessObjectの定義がないため、誰が知っていますか? (しかしおそらく、 'User'は常に' BusinessObject'ですが、 'BusinessObject'は' User'ではないかもしれないし、 'UserModel'は' BusinessObject'ではなく 'User'を望んでいるかもしれないからです) – Tibrogargan
何百もありますStack Overflowに関する質問は、あなたが何を求めているのかをすでに尋ねています。「どうして私のオブジェクトを何かに投げ込めないのですか?最も初期の例の1つは、重複したマークを参照してください。これには、あなたがしたいと考えるものは、実際には安全ではなく、あなたのコードが行うことができるものではないという理由で、いくつかの議論が含まれています。 –