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

标签 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 }

_workcontext 上调用 GetType() 将输出

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

类型层次是IWorkContext(接口(interface))« WebWorkContext « AbcWebWorkContext

_workContext 声明为 IWorkContext,Autofac 生成一个实例为 AbcWebWorkContext(如上所示)

最佳答案

new关键字意味着子类的方法隐藏基类的CurrentCustomer而不是覆盖,所以WebWorkContext.CurrentCustomer是一个与AbcWebWorkContext完全不同的方法。当前客户

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

virtual Customer CurrentCustomer { ... }

以及子类的方法

override Customer CurrentCustomer { ... }

我建议您阅读更多关于 polymorphism in c# 的内容.

如果您使用的方法实际上是在一个接口(interface) 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]);

关于c# - 为什么我的继承类没有隐藏我的基类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15400134/

相关文章:

Java OOP,如何将具有多个列表类型字段的类设计为单个类?

ruby - 执行包含多个模块的同名方法

c# - 检查数据表中列中的任何行是否无法从整数转换为字符串

c# - Visual Studio 加载项 : How do I Add Item Specific Commands to the Solution Explorer Context Menu

design-patterns - Monostate是邪恶的Singleton的好表亲吗?

java - 从具有相同方法签名的多个接口(interface)继承的类

C# IoT 设备 SDK、IotHubUnauthorizedAccess 仅当使用 X.509 证书 GetFileUploadSasUriAsync 时

c# - 从 C# winforms 中 SizeMode=stretch 的用户 Drawn PictureBox 保存图像

Javascript 继承 codecademy

c# - 如何扩展 Bitmap 类