覆盖部分类中的虚方法

Dev*_*ave 7 c# virtual overriding partial-classes nopcommerce

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

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

Orignal源代码:

namespace Nop.Services.Orders {

  public partial class OrderProcessingService : IOrderProcessingService {

        public virtual PlaceOrderResult PlaceOrder(ProcessPaymentRequest processPaymentRequest)
        { //....
Run Code Online (Sandbox Code Playgroud)

我的部分课程:

namespace Nop.Services.Orders {

  public partial class OrderProcessingService : IOrderProcessingService {

    public override PlaceOrderResult PlaceOrder(ProcessPaymentRequest processPaymentRequest) { //....
Run Code Online (Sandbox Code Playgroud)

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

类型'Nop.Services.Orders.OrderProcessingService'已经定义了一个名为'PlaceOrder'的成员,它具有相同的参数类型

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

Cla*_*edi 8

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

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

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

public class MyOrderProcessingService : OrderProcessingService
{
    public override PlaceOrderResult PlaceOrder(ProcessPaymentRequest processPaymentRequest) { //....
}
Run Code Online (Sandbox Code Playgroud)


Jep*_*sen 5

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

因此,负责该课程第一部分的"派对"可以单独签名:

"原始源代码":

namespace Nop.Services.Orders {

  public partial class OrderProcessingService : IOrderProcessingService {

    partial void PlaceOrder(ProcessPaymentRequest processPaymentRequest,
      ref PlaceOrderResult result);
Run Code Online (Sandbox Code Playgroud)

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

"我的部分班级":

namespace Nop.Services.Orders {

  public partial class OrderProcessingService : IOrderProcessingService {

    partial void PlaceOrder(ProcessPaymentRequest processPaymentRequest,
      ref PlaceOrderResult result) {

      // actual code goes here
    }
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • 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'
Run Code Online (Sandbox Code Playgroud)

意识到:

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

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