是可用于类之间的常用方法的接口

本文关键字:常用 接口 方法 之间 用于 | 更新日期: 2023-09-27 18:32:19

我想在许多类之间有一个通用方法来执行一些任务。它有效,但我不确定是否可以接受。使用 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();
    }
}

是可用于类之间的常用方法的接口

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

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

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

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

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

这是

绝对可以接受的。 我只建议您将 activeView 的类型从对象更改为 IView。 这样,您就不必强制转换它来执行两者共有的大多数操作。

只要确保这些方法之间的含义保持不变。 如果你在IView中有像"执行"这样的通用方法,你应该重新考虑你的策略。

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

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

确保将 - gridView.Children声明为 List<IView> 或其他什么。然后你可以直接这样做。

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

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

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

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