Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么继承的类没有隐藏基类方法?_C#_Oop_Inheritance_Polymorphism_Autofac - Fatal编程技术网

C# 为什么继承的类没有隐藏基类方法?

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

我有一个使用Autofac实例化对象的项目

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的论坛上询问,以检查系统中是否有任何其他点可以插入我想要的代码。谢谢:因为有人帮助我得出结论,我不可能以我想要的方式完成我想做的事情,所以我将其标记为答案