16

同じプロパティを使用するが、常にさらに派生した型のインターフェイス継承システムを作成しようとしています。したがって、基本プロパティは、派生インターフェイスによって何らかの方法でオーバーライドまたは非表示にする必要があります。

たとえば、Husband と Wife に派生する 2 つのインターフェイス、Man と Woman もインターフェイスです。男性と夫のインターフェースはどちらも「恋人」のプロパティを持ち、女性と妻のインターフェースは「最愛の人」のプロパティを持ちます。ここで、男性の「恋人」プロパティは女性型であり、夫の同じ「恋人」プロパティは妻 (女性から派生) である必要があります。そして、女性と妻の「最愛の」財産についても同じです。

public interface Man // base interface for Husband
{
    Woman sweetheart { get; set; }
}

public interface Woman // base interface for Wife
{
    Man darling { get; set; }
}

public interface Husband : Man // extending Man interface
{
    new Wife sweetheart { get; set; } // narrowing "sweetheart" property's type
}

public interface Wife : Woman // extending Woman interface
{
    new Husband darling { get; set; } // narrowing "darling" property's type
}

public class RandomHusband : Husband // implementing the Husband interface
{
    private RandomWife wife;
    public Wife sweetheart { get { return wife; } set { wife = value; } }
}

public class RandomWife : Wife // implementing the Wife interface
{
    private RandomHusband husband;
    public Husband darling { get { return husband; } set { husband = value; } }
}

このコードは間違っています。動作しません。タイプが一致しないため、基本Man.sweetheartWoman.darlingプロパティを実装していないこと、および実装されたHusband.sweetheartandが実行されないことが通知されています。Wife.darlingプロパティの型を派生型に絞り込む方法はありますか? C# でどのように達成しますか?

4

2 に答える 2

16

Manこれを行うには、およびWomanインターフェイスを具体的な実装タイプでパラメーター化します。

public interface IMan<M, W>
    where M : IMan<M, W>
    where W : IWoman<W, M>
{
    W Sweetheart { get; set; }
}

 public interface IWoman<W, M>
    where W : IWoman<W, M>
    where M : IMan<M, W>
{
    M Darling { get; set; }
}

その場合、実装は次のようになります。

public class Man : IMan<Man, Woman>
{
    public Woman Sweetheart { get; set; }
}

public class Woman : IWoman<Woman, Man>
{
    public Man Darling { get; set; }
}

public class Husband : IMan<Husband, Wife>
{
    public Wife Sweetheart { get; set; }
}

public class Wife : IWoman<Wife, Husband>
{
    public Husband Darling { get; set; }
}

型は非常に複雑になるため、関係を外部のクラス/インターフェースに移動することを検討することをお勧めします。

public interface Relationship<TMan, TWoman> 
    where TMan : Man 
    where TWoman : Woman
{
    TMan Darling { get; }
    TWoman Sweetheart { get; }
}

public class Marriage : Relationship<Husband, Wife>
{
}

次に、このクラスを使用して、具体的な実装を処理するときに型の安全性を維持できます。

public static void HandleMarriage(Relationship<Husband, Wife> marriage)
{
    Husband h = marriage.Darling;
    Wife w = marriage.Sweetheart;
}
于 2012-11-22T20:13:40.497 に答える
3

男と女のインターフェースだけでなく、夫と妻も満足させる必要があります...

public class RandomWife : Wife // implementing the Wife interface

    {
        private RandomHusband husband;
        public Husband darling { get { return husband; } set { husband = value; } }
        public Man  Wife.darling { get { return husband; } set { /* can't set anything */ } }

    }
于 2012-11-22T19:55:50.940 に答える