我有一个基本ViewModel,它有一个公共方法。事情起初非常简单,它的角色对于它的所有派生类都是一样的,但现在我们希望ViewModel根据派生类调用它来做不同的事情。
例如我们有:
public void DoMethod()
{
DoThisMethod();
}
我们想要像
这样的东西 public void DoMethod()
{
if (this.GetType().Name == "ThisName")
DoThisMethod();
else
DoAnotherMethod();
}
这样做是不对的?
答案 0 :(得分:4)
这是使用Method Overriding的完美方案。
您应该使用 OOP 方法概念覆盖此处:
public class BaseViewModel
{
public virtual void DoMethod()
{
DoThisMethod();
}
}
现在当您从BaseViewModel
继承某个类时,您可以使用覆盖定义DerivedViewModel
的不同实现:
public class DerivedViewModel:BaseViewModel
{
public override void DoMethod()
{
// implementation here
}
}
现在,当您使用DerivedViewModel
对象调用它时,DoMethod()
类型中定义的DerviedViewModel
的实现。
如果您无法访问BaseViewModel
的实施,那么您将不得不使用影子概念:
public class BaseViewModel
{
public void DoMethod()
{
DoThisMethod();
}
}
并在派生类型中:
public class DerivedViewModel:BaseViewModel
{
public new void DoMethod()
{
DoThisMethod();
}
}
但通常认为使用阴影并不好。
您可以阅读有关方法覆盖in this article
的更多信息答案 1 :(得分:2)
是的,从设计的角度来看,您提出的解决方案是错误的。您的基类应该与继承类型" ThisName"无关。使用您的命名,您可以通过以下方式实现它来解决您的问题:
public class ViewModel
{
public virtual void DoMethod()
{
DoAnotherMethod();
}
public void DoAnotherMethod() {...}
}
public class ThisName: ViewModel
{
public override void DoMethod()
{
DoThisMethod();
}
public void DoThisMethod() {...}
}