为什么继承的类没有隐藏基类方法?
本文关键字:隐藏 基类 类方法 继承 为什么 | 更新日期: 2023-09-27 18:03:43
我有一个使用autofacc实例化对象的项目
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
(interface) «WebWorkContext
«AbcWebWorkContext
_workContext
被声明为IWorkContext
, Autofac生成一个实例为AbcWebWorkContext
(如上所示)
new
关键字意味着子类的方法隐藏了基类的CurrentCustomer
而不是覆盖,所以WebWorkContext.CurrentCustomer
是一个完全不同于AbcWebWorkContext.CurrentCustomer
的方法。
必须将基类的方法声明为
virtual Customer CurrentCustomer { ... }
和子类的方法
override Customer CurrentCustomer { ... }
我建议你阅读更多关于c#中的多态性的内容。
如果您使用的方法实际上是在接口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