首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口继承

接口继承
EN

Stack Overflow用户
提问于 2013-05-30 12:09:18
回答 7查看 120关注 0票数 1

我有一个名为IStrategy的接口

代码语言:javascript
复制
public interface IStrategy
{
}

我有另一个名为IClickStrategy的接口,它继承自IStrategy。它有一个名为GetClicks()的方法

代码语言:javascript
复制
public interface IClickStrategy : IStrategy
{
   void GetClicks(string[] args);
}

以及从IClickStrategy继承并实现GetClicks()方法的类:

代码语言:javascript
复制
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)
    {
        ...
    }
}

在我的主要方法上,取决于策略的类型,我想在我拥有的一切之前决定do.So的内容:

代码语言:javascript
复制
IStrategy strategy = null;

然后,如果输入参数想获得单击信息,我想从类UnionenClicksController().调用GetClicks函数。

但是可以看到,我看不到GetClicks()函数。但是,如果我将策略更改为IClickStrategy,,那么它将看到我的GetClicks。但这不是我想要的,因为我可能有一个不同的策略,而不是点击,我不想在我的主要方法开始声明它。

我做错什么了?谢谢。

EN

回答 7

Stack Overflow用户

发布于 2013-05-30 12:10:24

IStrategy不包含GetClicks,它可以在IClickStrategy接口中找到。

变化

代码语言:javascript
复制
IStrategy strategy = null;

代码语言:javascript
复制
IClickStrategy strategy = null;

你也可以试着把它转换到适当的界面,

如果您确信它实现了正确的接口:

代码语言:javascript
复制
((IClickStrategy)strategy).GetClicks();

如果你不确定:

代码语言:javascript
复制
var s = strategy as IClickInterface;
if (s != null)
{
    s.GetClicks();
}
票数 1
EN

Stack Overflow用户

发布于 2013-05-30 12:11:59

您必须对每种情况进行强制转换,或者在IStrategy中有一个选择正确方法的虚拟方法。

如果一个对象实现多个策略,则后一种解决方案是不可能的。

票数 1
EN

Stack Overflow用户

发布于 2013-05-30 12:14:20

代码语言:javascript
复制
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(...);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16835741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档