[英]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.