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

时间:2013-03-14 02:31:01

标签: c# oop inheritance polymorphism autofac

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

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 }

GetType()上调用_workcontext将输出

  

{Name = "AbcWebWorkContext" FullName = "Nop.Web.Framework.AbcWebWorkContext"}

类型层次结构为IWorkContext(界面)«WebWorkContext«AbcWebWorkContext

_workContext被声明为IWorkContext,Autofac会将实例生成为AbcWebWorkContext(如上所示)

2 个答案:

答案 0 :(得分:3)

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

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

virtual Customer CurrentCustomer { ... }

子类的方法

override Customer CurrentCustomer { ... }

我建议您阅读有关polymorphism in 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]);

答案 1 :(得分:2)

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

了解有关MSDN

的更多信息