C#-仅在子类中调用重写的方法
我试图解决以下OO问题。我知道它有点臭,但我必须适应现有的设计。考虑下面的片段: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);
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
,它将调用旧函数而不是新替换的函数。您得到的结果是什么,它与您想要的有什么不同?问题是……?这不正是默认行为(novirtual
)所做的吗,还是我忽略了什么?好的,问题在于GetData2
,唯一的解决方案是重写GetData2
并调用base.GetContext
将虚拟对象从父对象中移除。GetContext关于new
修饰符陷阱的强制性警告可能会有所帮助,我想(即Child x=new Child();x.GetData2();
与parent x=new Child();x.GetData2();
)问题不在于父母,而在于孩子。