我希望在许多类之间有一个通用的方法来执行一些任务。它有效,但我不确定它是否可以接受。用freeView()方法实现接口的两个类的示例:
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();
}
}发布于 2016-01-28 10:48:38
这种接口的使用是正确的。但是,您应该在客户端中使用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检查。
发布于 2016-01-28 10:49:16
这是绝对可以接受的。我只建议您将activeView类型从object更改为IView。通过这种方式,您不必强制转换它来执行两种操作所共有的大多数操作。
只需确保这些方法之间的含义保持不变。如果在IView中有像"execute“这样的通用方法,那么您应该重新考虑您的策略。
发布于 2016-01-28 11:00:18
当您说您正在为您的类实现一个接口IView时,这意味着您要向您的类添加一个视图行为。那些实现IView的类承诺它将具有这种行为。
因此,当您只想访问特定行为时,可以专门为类之间的公共方法创建接口。
确保您声明- gridView.Children为List<IView>或其他什么。然后你就可以直接这么做了。
activeView = new BrowserView(this, settings.sourcePath);
gridView.Children.Add(activeView);然后您就可以访问IView方法了。例如:
foreach(var child gridView.Children)
{
child.FreeView();
}https://stackoverflow.com/questions/35059190
复制相似问题