繁体   English   中英

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

[英]Why is my inherited class not hiding my base class method?

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

builder.RegisterType<AbcWebWorkContext>().As<IWorkContext>().InstancePerHttpRequest();

AbcWebWorkContext是的子类WebWorkContext

public partial class AbcWebWorkContext : WebWorkContext

在我的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 (如上所示)

new关键字意味着子类的方法将隐藏基类的CurrentCustomer而不是覆盖它,因此WebWorkContext.CurrentCustomer是与AbcWebWorkContext.CurrentCustomer完全不同的方法。

您必须将基类的方法声明为

virtual Customer CurrentCustomer { ... }

和子类的方法

override Customer CurrentCustomer { ... }

我建议您阅读有关c#中多态性的更多信息。

如果您使用的方法实际上是在接口IWebWorkContext定义的, 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]);

我不确定我是否正确回答了您的问题,但是我认为您需要向基类中的方法添加一个virtual修饰符,并向子类中的方法添加一个override修饰符。

MSDN上找到更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM