覆盖部分类中的虚方法

我目前正在使用nopCommerce源代码并尽力避免编辑源代码,而是使用与源代码分开的部分类和插件,我们是否需要升级版本。

我想通过在同一个程序集中使用部分类来对下订单的代码进行一些更改:

Orignal源代码:

namespace Nop.Services.Orders { public partial class OrderProcessingService : IOrderProcessingService { public virtual PlaceOrderResult PlaceOrder(ProcessPaymentRequest processPaymentRequest) { //.... 

我的部分课程:

 namespace Nop.Services.Orders { public partial class OrderProcessingService : IOrderProcessingService { public override PlaceOrderResult PlaceOrder(ProcessPaymentRequest processPaymentRequest) { //.... 

当我尝试编译此代码时,我收到一个错误:

类型’Nop.Services.Orders.OrderProcessingService’已经使用相同的参数类型定义了一个名为’PlaceOrder’的成员

但我使用override ,原始类中的方法是virtual ,有人可以告诉我这里我出错了,以及如何覆盖此方法?

您不能覆盖同一个类上的虚方法。 部分类只是在不同的地方拆分定义的同一个类,它没有定义层次结构,所以这是不可能的

可以通过两个或多个源文件拆分类或结构的定义或接口。 每个源文件都包含类定义的一部分,并且在编译应用程序时将所有部分组合在一起

您应该创建一个inheritance的类来实现您的目标

 public class MyOrderProcessingService : OrderProcessingService { public override PlaceOrderResult PlaceOrder(ProcessPaymentRequest processPaymentRequest) { //.... } 

不完全清楚你想要什么,但也许你可以使用partial方法

所以负责class级第一部分的“政党”可以单独签名:

“Orignal源代码”:

 namespace Nop.Services.Orders { public partial class OrderProcessingService : IOrderProcessingService { partial void PlaceOrder(ProcessPaymentRequest processPaymentRequest, ref PlaceOrderResult result); 

然后,负责另一“部分”的“方”可能会或可能不会选择提供该方法的实现。 如果他们提供一个,那将看起来像:

“我的部分class级”:

 namespace Nop.Services.Orders { public partial class OrderProcessingService : IOrderProcessingService { partial void PlaceOrder(ProcessPaymentRequest processPaymentRequest, ref PlaceOrderResult result) { // actual code goes here } 

注意事项:

  • partial方法不能public ; 它必须是私有的,甚至指定private关键字也是非法的。 并且不允许私有方法是virtual
  • partial方法必须返回void并且不能将参数标记为out ,因此我们将result作为ref参数
  • 第一个“部分”中的声明有分号; 而不是一个身体
  • 另一个“部分”中的实现,如果存在,则有一个方法体{ ... }

现在在“Orignal源代码”中,可以像这样调用该方法:

 // ... PlaceOrderResult result = null; PlaceOrder(someRequest, ref result); // check if 'result' was changed to something non-null, and if so use 'result' 

意识到:

  • 如果该类的“部分”没有选择实现PlaceOrder ,则在编译之前(从心理上)将该方法(包括对它的所有调用!)从类的所有部分中删除 。 这也消除了调用中参数的评估,如果评估有副作用,这可能很重要(例如PlaceOrder(FindRequestAndCauseOtherEffects(), ref result); )。
  • 我之前提到的方法必须返回void并且没有out参数的限制可以理解为其结果。

关于partial void方法的今天课程结束。

您可以使用partial class来分割多个类的代码,但不能在2个分部类中拆分单个方法。 您只需要在一个地方拥有方法。 如果您想扩展function,那么请寻找适合您的场景的其他方法,如子类或组合等。

问题是你在技术上仍然属于同一个class级。 部分类在编译时基本上是组合在一起的,所以它看到的是在同一个类中定义的两种方法。 如果您使用了子类,则可以这样做,但是您不能在同一个类中定义两次方法。

你不能这样做。 partial基本上做的是告诉C#编译器将两位代码连接在一起。

一个hacky解决方案是完成类,然后inheritance并覆盖你想要的方法,例如这里是一个简单的例子:

 public partial class A { public virtual void X() { } } public partial class A { public void Y() { } } public class B : A { public override void X() { } }