是可用于类之间的常用方法的接口
本文关键字:常用 接口 方法 之间 用于 | 更新日期: 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
更明智和更容易理解。您可以多个接口来表示不同的概念。再一次,从技术上讲,你正在做的事情是正确的,但从设计的角度来看,我的建议可能会更好。