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

时间:2016-01-28 10:43:00

标签: c# methods interface

我希望在许多类之间有一个共同的方法来完成一些任务。它工作,但我不确定它是否可以接受..使用freeView()方法实现接口的2个类的示例:

class BrowserView : ChromiumWebBrowser, IView
    {
        public void freeView()
        {
            // Some work
        }
    }

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

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

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
private void deleteView()
{
    if(activeView != null)
    {
        ((IView)activeView).freeView();
    }
}

4 个答案:

答案 0 :(得分:2)

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

private IView activeView = null; 
// ...
activeView.freeView(); // No casting here!

您还可以添加一个不执行任何操作的IView实施(null object模式),以避免null检入您的代码:

switch (settings.vue)
{
    case Vue.Website:
        // ...
    case Vue.Video:
        // ...
    default:
        activeView = new EmptyView();
}

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

答案 1 :(得分:2)

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

请确保这些方法之间的含义保持不变。如果您在IView中使用“执行”等通用方法,则应重新考虑您的策略。

答案 2 :(得分:1)

当您说您正在为您的班级实施界面IView时,这意味着您正在向您的班级添加“查看”行为。哪个实现IView的类都会承诺会有这种行为。

所以,当您只想访问该特定行为时,可以专门为类之间的常用方法创建一个接口。

请务必声明 - gridView.ChildrenList<IView>或其他任何内容。然后你可以直接这样做。

activeView = new BrowserView(this, settings.sourcePath);
gridView.Children.Add(activeView);

然后您可以按原样访问IView方法。例如,

foreach(var child gridView.Children)
{
  child.FreeView();
}

答案 3 :(得分:1)

基于概念创建接口不是因为您需要跨类对几个方法进行分组。例如,IActivatableView等接口比IView对客户更明智,更容易理解。您可以使用多个接口来表示不同的概念。从技术上讲,你所做的事情是正确的,但从设计的角度来看,我所建议的可能会更好。