C# 为什么继承的类没有隐藏基类方法?
我有一个使用Autofac实例化对象的项目C# 为什么继承的类没有隐藏基类方法?,c#,oop,inheritance,polymorphism,autofac,C#,Oop,Inheritance,Polymorphism,Autofac,我有一个使用Autofac实例化对象的项目 builder.RegisterType<AbcWebWorkContext>().As<IWorkContext>().InstancePerHttpRequest(); 在我的AbcWebWorkContext中,我想对父类隐藏一个方法和一个属性 protected new Customer GetCurrentCustomer(){ //do stuff } new public Customer CurrentCust
builder.RegisterType<AbcWebWorkContext>().As<IWorkContext>().InstancePerHttpRequest();
在我的AbcWebWorkContext中,我想对父类隐藏一个方法和一个属性
protected new Customer GetCurrentCustomer(){ //do stuff }
new public Customer CurrentCustomer { //do studd }
但是当有人打电话时
_workContext.CurrentCustomer
调用基类属性。如果我这样称呼它
((AbcWebWorkContext) _workContext).CurrentCustomer
它起作用了
我想知道为什么我不能隐藏父方法。
我不能更改被调用的类,因为它位于NopCommerce的核心,我不想更改
为什么不隐藏方法呢
方法的基类声明:
protected Customer GetCurrentCustomer() { // do stuff }
public Customer CurrentCustomer{ // do stuff }
在_workcontext上调用GetType将输出
{Name=AbcWebWorkContext FullName=Nop.Web.Framework.AbcWebWorkContext}
类型层次结构是IWorkContext接口«WebWorkContext«AbcWebWorkContext
_workContext声明为IWorkContext,Autofac生成一个实例为AbcWebWorkContext,如上所示我不确定您的问题是否正确,但我认为您需要向基类中的方法添加虚拟修饰符,并向子类中的方法添加重写修饰符
了解有关的更多信息我不确定您的问题是否正确,但我认为您需要向基类中的方法添加虚拟修饰符,并向子类中的方法添加重写修饰符 了解有关的更多信息关键字意味着子类的方法隐藏基类的CurrentCustomer而不是重写,因此WebWorkContext.CurrentCustomer与AbcWebWorkContext.CurrentCustomer是完全不同的方法 必须将基类的方法声明为
virtual Customer CurrentCustomer { ... }
以及子类的方法
override Customer CurrentCustomer { ... }
我建议你多读一些关于
如果您使用的方法实际上是在接口IWebWorkContext中定义的,那么您只需封装基类而不是从基类继承,如下所示:
class AbcWebWorkContext : IWebWorkContext
{
private WebWorkerContext _inner = new WebWorkerContext();
public Customer CurrentCustomer { ... }
}
如果不能使基类的方法虚拟化,则必须做一些不那么优雅的事情,如反射:
var prop = _workContext.GetType().GetProperty("CurrentCustomer");
var value = (Customer)prop.GetValue(_workContext, new object[0]);
关键字意味着子类的方法隐藏基类的CurrentCustomer而不是重写,因此WebWorkContext.CurrentCustomer是与AbcWebWorkContext.CurrentCustomer完全不同的方法
必须将基类的方法声明为
virtual Customer CurrentCustomer { ... }
以及子类的方法
override Customer CurrentCustomer { ... }
我建议你多读一些关于
如果您使用的方法实际上是在接口IWebWorkContext中定义的,那么您只需封装基类而不是从基类继承,如下所示:
class AbcWebWorkContext : IWebWorkContext
{
private WebWorkerContext _inner = new WebWorkerContext();
public Customer CurrentCustomer { ... }
}
如果不能使基类的方法虚拟化,则必须做一些不那么优雅的事情,如反射:
var prop = _workContext.GetType().GetProperty("CurrentCustomer");
var value = (Customer)prop.GetValue(_workContext, new object[0]);
该方法是如何在基类中声明的?@pickypg将其添加到问题中的方法是如何在基类中声明的?@pickypg将其添加到问题中的是,这将覆盖该方法,但我无法添加虚拟,因为我无法更改源code@Oscar,C不像Java,默认情况下方法不是虚拟的。如果无法修改基类以使方法为虚拟,则无法在子类中重写它。您可以选择隐藏它,但正如您所发现的,除了通过派生类自己的引用之外,它没有多大用处。我在这个问题的标题中写道。我是说藏起来。我会编辑它。在_workcontext中调用gettype将输出{Name=AbcWebWorkContext FullName=Nop.Web.Framework.AbcWebWorkContext}。因此,应该调用该方法的AbcWebWorkContext版本。对吗?@Oscar注意到它实际上隐藏了基类方法。这就是隐藏方法的工作原理。@p.s.w.g抱歉,我没有理解。如果它隐藏基类方法,为什么要调用基类方法而不是子类?是的,这将覆盖该方法,但我无法添加虚拟,因为我无法更改源code@Oscar,C不像Java,默认情况下方法不是虚拟的。如果无法修改基类以使方法为虚拟,则无法在子类中重写它。您可以选择隐藏它,但正如您所发现的,除了通过派生类自己的引用之外,它没有多大用处。我在这个问题的标题中写道。我是说藏起来。我会编辑它。在_workcontext中调用gettype将输出{Name=AbcWebWorkContext FullName=Nop.Web.Framework.AbcWebWorkContext}。因此,应该调用该方法的AbcWebWorkContext版本。对吗?@Oscar注意到它实际上隐藏了基类方法。这就是隐藏方法的工作原理。@p.s.w.g抱歉,我没有理解。如果它隐藏了基类方法,为什么要调用基类方法而不是子类?我不能,因为我不能更改核心源代码。在_workcontext中调用gettype将输出{Name=AbcWebWorkContext FullName=Nop.Web.Framework.AbcWebWorkContext}。因此,应该调用该方法的AbcWebWorkContext版本。对吗?对不起,我既没有呼叫者代码也没有被呼叫者代码。我正在尝试拦截呼叫,以便在没有changin的情况下更改其行为
g核心代码。@Oscar那么恐怕重新实现接口可能是您唯一的选择。=/这很糟糕。我将直接在nopcommerce的论坛上询问,以检查系统中是否有任何其他点可以插入我想要的代码。谢谢:因为有人帮助我得出结论,我不可能以我想要的方式完成我想做的事情,我不能,因为我不能更改核心源代码。在_workcontext中调用gettype将输出{Name=AbcWebWorkContext FullName=Nop.Web.Framework.AbcWebWorkContext}。因此,应该调用该方法的AbcWebWorkContext版本。对吗?对不起,我既没有呼叫者代码也没有被呼叫者代码。我正试图截获该调用,以便在不更改内核代码的情况下更改其行为。@Oscar那么恐怕重新实现接口可能是您唯一的选择。=/这不好。我将直接在nopcommerce的论坛上询问,以检查系统中是否有任何其他点可以插入我想要的代码。谢谢:因为有人帮助我得出结论,我不可能以我想要的方式完成我想做的事情,所以我将其标记为答案