10

以下は考案されたものですが、我慢してください。

interface Clonable<TSubClass>
{
    TSubClass Clone();
}

TSubClassを実装タイプに制限するにはどうすればよいですか?

つまり、実装者にこれを行わせるだけです。

class Dog : Clonable<Dog>
{
    Dog Clone() 
    {
        ....
    }
}

これではない:

class BadDog : Clonable<Rabbit>
{
    Rabbit Clone()
    {
        ....
    }
}
4

2 に答える 2

8

慣例と文書化によってのみ、それを強制することはできません。

私にとっての慣習は、のようなものを使用することですTSelf

interface ICloneable<TSelf> where TSelf : ICloneable<TSelf> { ... }

また、このインターフェースを実装または継承する非コンクリート構造物は、制約を通過させる必要があることに注意してください...

[Serializable]
abstract class SerializableCloneable<TSelf> : ICloneable<TSelf> 
  where TSelf : SerializableCloneable<TSelf> { ... }

:このチェックは、セルフタイプパラメーターを呼び出す規則を使用してNRolesに実装しました。S

于 2012-07-19T21:54:46.573 に答える
3

.NETジェネリックにはテンプレートの特殊化やダックタイピングがないため、コンパイル時にこれを強制することはできません。

ただし、リフレクションを使用してロード時に関係をアサートする静的コンストラクター(タイプ初期化子)を含めることができます。わかりました。C#ではインターフェイスに静的コンストラクターを配置できません(.NETでは許可されていますが)。そのため、モジュール初期化子または自分で呼び出す関数を使用する必要があります。また、まだロードされていないタイプを含め、インターフェイスを実装しているタイプを検索する必要があります(Assembly.Loadイベントをサブスクライブして、将来ロードされるタイプの通知を受け取ることができます)。

于 2012-07-19T22:22:38.003 に答える