通过使用基本ViewModel类来确定当前类型来违反多态性?

时间:2015-09-21 06:28:56

标签: c# wpf polymorphism

我有一个基本ViewModel,它有一个公共方法。事情起初非常简单,它的角色对于它的所有派生类都是一样的,但现在我们希望ViewModel根据派生类调用它来做不同的事情。

例如我们有:

    public void DoMethod()
    {
        DoThisMethod();
    }

我们想要像

这样的东西
    public void DoMethod()
    {
        if (this.GetType().Name == "ThisName")
           DoThisMethod();
        else
           DoAnotherMethod();
    }

这样做是不对的?

2 个答案:

答案 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() {...}
}