我希望在许多类之间有一个共同的方法来完成一些任务。它工作,但我不确定它是否可以接受..使用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()方法时,我会像那样
转换activeViewprivate void deleteView()
{
if(activeView != null)
{
((IView)activeView).freeView();
}
}
答案 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.Children
为List<IView>
或其他任何内容。然后你可以直接这样做。
activeView = new BrowserView(this, settings.sourcePath);
gridView.Children.Add(activeView);
然后您可以按原样访问IView方法。例如,
foreach(var child gridView.Children)
{
child.FreeView();
}
答案 3 :(得分:1)
基于概念创建接口不是因为您需要跨类对几个方法进行分组。例如,IActivatableView
等接口比IView
对客户更明智,更容易理解。您可以使用多个接口来表示不同的概念。从技术上讲,你所做的事情是正确的,但从设计的角度来看,我所建议的可能会更好。