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

本文关键字:隐藏 基类 类方法 继承 为什么 | 更新日期: 2023-09-27 18:03:43

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

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

这个AbcWebWorkContextWebWorkContext的一个子类:

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