0

たとえば、から派生しManYouCanHitた 2 つのクラスRichManとのアダプタ クラスがあるとします。そして、またはのインスタンスにのみアクセスできますTaxiDriverPersonRichManTaxiDriver

public interface IManYouCanHit
{
    bool CanIHitThisGuy;
}

public class ManYouCanHit : IManYouCanHit
{
    private enum ManType
    {
        Rich = 0,
        TaxiDriver = 1
    }

    private RichMan richMan;
    private TaxiDriver driver;
    private ManType type;

    public Object ManReference
    {
        get
        {
            if(this.type == ManType.Rich)
            {
                return this.richMan;
            }
            else
            {
                return this.driver;
            }
        }
    }

    public bool CanIHitThisGuy
    {
        get{
            bool canHit = true;
            if(this.type == ManType.RichMan)
            {
                canHit = false;
            }
            return canHit;
        }
    }

    public ManYouCanHit(Person someone)
    {
        if(someone is RichMan)
        {
            this.richMan = someone;
            this.type = ManType.Rich;
        }
        else if(someone is TaxiDriver)
        {
            this.driver = someone;
            this.type = ManType.TaxiDriver;
        }
        else
        {
            // throw an error
        }
    }
}

実際のロジックは例よりも複雑です。実装するプロパティとメソッドが多数あります。CanIHitThisGuy

2 つのオブジェクトを 1 つのアダプターにラップしても問題ありませんか? 他にどのようなパターンに従うことができますか?

このデザインの良し悪しは?アドバイスをお願いできますか?

経由で元のオブジェクトを公開する必要がありますManReferenceか?

4

2 に答える 2

1

2 つのオブジェクトを 1 つのアダプターにラップしても問題ありませんか?

はい、2 種類のオブジェクトを意味する場合は可能です。あなたがした方法ではありません。OO を有効に使用していません。

他にどのようなパターンに従うことができますか?

アダプターのパターンはクールで、理にかなっている場合は利用する必要があります。しかし、より良いものがあるかどうかは、あなたが提供した情報を考慮して、今あなただけが決めることができるものです.

このデザインの良し悪しは?

悪い。

ManReference を介して元のオブジェクトを公開する必要がありますか?

あなただけが知っています。心配なら不変にしてください。

アドバイスをお願いできますか?

私はそれを次のように書き直します:

public interface IManYouCanHit
{
    bool CanIHitThisGuy;
}

public class ManYouCanHit : IManYouCanHit
{
    public ManYouCanHit(Person someone)
    {
        if (!(someone is RichMan) && !(someone is TaxiDriver))
            throw;

        Man = someone;
    }

    public Person Man { get; private set; }

    public bool CanIHitThisGuy
    {
        get
        {
           //this is not good, better to have IsHittable property on Person class
           //so that you can return just Man.IsHittable
            return !(Man is RichMan);
        }
    }
}

Personコンストラクターで 1 人だけを取り込むため、クラスで必要なのは参照だけです。保証されている場合は、コンストラクターで例外をスローできます。

于 2013-06-16T11:10:41.357 に答える