首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口可以用于类之间的常用方法吗?

接口可以用于类之间的常用方法吗?
EN

Stack Overflow用户
提问于 2016-01-28 10:43:00
回答 4查看 209关注 0票数 0

我希望在许多类之间有一个通用的方法来执行一些任务。它有效,但我不确定它是否可以接受。用freeView()方法实现接口的两个类的示例:

代码语言:javascript
复制
class BrowserView : ChromiumWebBrowser, IView
    {
        public void freeView()
        {
            // Some work
        }
    }

class VideoView : Canvas, IView
{
    public void freeView()
    {
        // Some work
    }
}`

我在我的主模块中调用了这样的方法:

代码语言:javascript
复制
private object activeView =  null; 
            switch (settings.vue)
            {
                case Vue.Website:
                    activeView = new BrowserView(this, settings.sourcePath);
                    gridView.Children.Add(activeView as BrowserView);
                    break;
                case Vue.Video:
                    activeView = new VideoView(this, settings.sourcePath);
                    gridView.Children.Add(activeView as VideoView);
                    break;
            }

当我需要调用freeView()方法时,我像这样转换了activeView

代码语言:javascript
复制
private void deleteView()
{
    if(activeView != null)
    {
        ((IView)activeView).freeView();
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-01-28 10:48:38

这种接口的使用是正确的。但是,您应该在客户端中使用IView接口引用而不是object,以避免转换:

代码语言:javascript
复制
private IView activeView = null; 
// ...
activeView.freeView(); // No casting here!

您还可以再添加一个不做任何事情的IView实现(null object模式),以避免在代码中检查null

代码语言:javascript
复制
switch (settings.vue)
{
    case Vue.Website:
        // ...
    case Vue.Video:
        // ...
    default:
        activeView = new EmptyView();
}

因此,在您的客户端代码中,您可以省略if(activeView != null) nulltiy检查。

票数 2
EN

Stack Overflow用户

发布于 2016-01-28 10:49:16

这是绝对可以接受的。我只建议您将activeView类型从object更改为IView。通过这种方式,您不必强制转换它来执行两种操作所共有的大多数操作。

只需确保这些方法之间的含义保持不变。如果在IView中有像"execute“这样的通用方法,那么您应该重新考虑您的策略。

票数 2
EN

Stack Overflow用户

发布于 2016-01-28 11:00:18

当您说您正在为您的类实现一个接口IView时,这意味着您要向您的类添加一个视图行为。那些实现IView的类承诺它将具有这种行为。

因此,当您只想访问特定行为时,可以专门为类之间的公共方法创建接口。

确保您声明- gridView.ChildrenList<IView>或其他什么。然后你就可以直接这么做了。

代码语言:javascript
复制
activeView = new BrowserView(this, settings.sourcePath);
gridView.Children.Add(activeView);

然后您就可以访问IView方法了。例如:

代码语言:javascript
复制
foreach(var child gridView.Children)
{
  child.FreeView();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35059190

复制
相关文章

相似问题

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