1

我有一个名为IStrategy的接口:

public interface IStrategy
{
}

我有另一个名为IClickStrategy的接口,它继承自IStrategy。它有一个名为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。但这不是我想要的,因为我可能有不同的策略而不是点击,我不想在我的 main 方法的开头声明它。

我做错了什么?谢谢。

4

7 回答 7

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 回答
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 回答
0

感谢所有答案,但我找到了两个解决我的问题的方法:

首先,是不使用该行:

IStrategy strategy = null;

并将其推迟到每个 switch 语句之后,然后将策略声明为 IClickStrategy。

其次,如果我想保持我的IStrategy strategy = null; 我在 IStrategy 界面中将 GetClicks 方法上移了一层,并给了它一个更通用的名称:GetItems

现在我的开关盒看起来像这样:

case "GETCLICKSUNIONEN":
    strategy = new UnionenClicksController();
    strategy.GetItems(args);                            
    break;
于 2013-05-30T14:21:08.010 回答
0

试试看

IClickStrategy strategy = null;

因为UnionenClicksController 不继承IStrategy。

于 2013-05-30T12:13:15.617 回答
0

尝试使用这个:

if(strategy is IClickStrategy)
    (strategy as IClickStrategy).GetClicks();

从技术上讲,您需要首先检查对象的类型,然后对其进行强制转换以查看继承接口的方法。

于 2013-05-30T12:16:44.303 回答
0

你当然知道。但是编译器不知道这一点。你只是告诉他,你想当strategy一个IStrategy。你对此非常明确。现在...

不要将名称strategy与您的UnionenClicksControler对象混淆 - 它只是对象的名称。并且名称有类型。如果您想了解该GetClicks()方法,只需执行以下操作:

(strategy as IClickStrategy).GetClicks(args);

我自己还没有尝试过,因为我还没来得及做,但是做

dynamic strategy;

也可能解决您的问题...但您可能会失去任何 IntelliSense 魔法...

于 2013-05-30T12:14:50.167 回答