C#-仅在子类中调用重写的方法

C#-仅在子类中调用重写的方法,c#,oop,C#,Oop,我试图解决以下OO问题。我知道它有点臭,但我必须适应现有的设计。考虑下面的片段: class Parent { public virtual Context GetContext() { return new Context(true); } public virtual GetData() { var context = GetContext(); var result = Query(context);

我试图解决以下OO问题。我知道它有点臭,但我必须适应现有的设计。考虑下面的片段:

class Parent
{
   public virtual Context GetContext()
   {
       return new Context(true);
   }

   public virtual GetData()
   {
       var context = GetContext();
       var result = Query(context);
       return result;
   }

   public string GetData2()
   {
       var context = GetContext();
       var result = Query(context);
       return result;
   }

}

class Child : Parent
{
   public override Context GetContext()
   {
       return new Context(false);
   }

   public override GetData()
   {
       var context = GetContext();
       var result = Query(context);
   }
}
我希望得到以下结果:

new Parent().GetData() => would call Parent.GetContext();
new Parent().GetData2() => would call Parent.GetContext();
new Child().GetData() => would call Child.GetContext();
new Child().GetData2() (not overriden in Child) => would call Parent.GetContext();
实际结果是:

new Parent().GetData() => calls Parent.GetContext();
new Parent().GetData2() => calls Parent.GetContext();
new Child().GetData() => calls Child.GetContext();
new Child().GetData2() => calls Child.GetContext();

你可以有这样的东西:

class Parent
{
   public virtual Context GetContext()
   {
       return GetContextParentCall();
   }

   private Context GetContextParentCall()
   {
       return new Context(true);
   }

   public virtual GetData()
   {
       var context = GetContext();
       var result = Query(context);
       return result;
   }

   public string GetData2()
   {
       var context = GetContextParentCall();
       var result = Query(context);
       return result;
   }

}
您需要覆盖(在本例中替换)GetData2函数:

    class Child : Parent
    {
       public override Context GetContext()
       {
           return new Context(false);
       }

       public override GetData()
       {
           var context = GetContext();
           var result = Query(context);
       }

       public new string GetData2()
       {
           var context = base.GetContext();
           return Query(context);
       }
    }

请记住,使用新修饰符不会覆盖基函数,如果替换它,这意味着如果您将
子函数
转换为
父函数
,并调用
GetData2
,它将调用旧函数而不是新替换的函数。

您得到的结果是什么,它与您想要的有什么不同?问题是……?这不正是默认行为(no
virtual
)所做的吗,还是我忽略了什么?好的,问题在于
GetData2
,唯一的解决方案是重写
GetData2
并调用
base.GetContext
将虚拟对象从父对象中移除。GetContext关于
new
修饰符陷阱的强制性警告可能会有所帮助,我想(即
Child x=new Child();x.GetData2();
parent x=new Child();x.GetData2();
)问题不在于父母,而在于孩子。