1

私はIStrategyというインターフェースを持っています:

public interface IStrategy
{
}

IStrategyから継承するIClickStrategyという別のインターフェイスがあります。GetClicks()というメソッドがあります。

public interface IClickStrategy : IStrategy
{
   void GetClicks(string[] args);
}

IClickStrategyから継承し、 GetClicks()メソッドを実装するクラス:

public class UnionenClicksController : IClickStrategy
{
    Models.DMDelivery.Unionen model;
    Logger logger;

    public UnionenClicksController()
    {
        this.model = new Models.DMDelivery.Unionen();
        this.logger = new Logger();
    }

    public void GetClicks(string[] args)
    {
        ...
    }
}

私の主な方法では、戦略の種類に応じて、何をすべきかを決定したいと思います。

IStrategy strategy = null;

そして、入力パラメーターがクリック情報を取得したい場合は、クラスUnionenClicksController()から GetClicks 関数を呼び出したいと思います。

ここに画像の説明を入力

しかし、ご覧のとおり、 GetClicks()関数が表示されません。ただし、戦略をIClickStrategyに変更すると、GetClicksが表示されます。しかし、クリック以外の別の戦略を持っている可能性があり、メイン メソッドの先頭でそれを宣言したくないので、それは私が望むものではありません。

私が間違っているのは何ですか?ありがとう。

4

7 に答える 7

1

IStrategyは含まれていません。インターフェイスGetClicksで見つかりIClickStrategyます。

変化する

IStrategy strategy = null;

IClickStrategy strategy = null;

適切なインターフェースにキャストすることもできます。

正しいインターフェースを実装していることが確実な場合:

((IClickStrategy)strategy).GetClicks();

よくわからない場合:

var s = strategy as IClickInterface;
if (s != null)
{
    s.GetClicks();
}
于 2013-05-30T12:10:24.423 に答える
1

ケースごとにキャストするかIStrategy、適切なメソッドを選択する仮想メソッドを用意する必要があります。

オブジェクトが複数の戦略を実装している場合、後者の解決策は不可能です。

于 2013-05-30T12:11:59.790 に答える
1
IStrategy strategy = null;

.
.
.  later on you find that you need to see if it contains a IClickStrategy ..
.

IClickStrategy clicker = strategy as IClickStrategy;

if(clicker != null) {
  clicker.GetClicks(...);
}
于 2013-05-30T12:14:20.447 に答える
0

それを試してみてください

IClickStrategy strategy = null;

UnionenClicksController は IStrategy を継承しないためです。

于 2013-05-30T12:13:15.617 に答える
0

確かにそうです。しかし、コンパイラはそれを知りません。あなたはちょうど彼に言っstrategyた、あなたはとして扱いたいIStrategy. あなたはそれについて非常に明確でした。今...

strategy名前をオブジェクトと混同しないでくださいUnionenClicksControler。これは単なるオブジェクトの名前です。そして名前には型があります。GetClicks()メソッドを取得したい場合は、次のようにします。

(strategy as IClickStrategy).GetClicks(args);

まだやっていないので、自分でこれを試したことはありませんが、

dynamic strategy;

あなたの問題も解決するかもしれません...しかし、おそらくIntelliSenseの魔法を失います...

于 2013-05-30T12:14:50.167 に答える