C# - 通过继承进行运算符重载

问题描述 投票:0回答:1

我正在尝试想出一种方法来实现在我的班级上执行突变测试的方法(是的,我知道 Stryker .NET)。

为了简单起见,假设我想编写一个 Mutator 类,某些服务将继承该类,它将所有加法转换为减法。我想知道是否可以在不对服务类进行任何更改的情况下实现这一目标。

我有这项服务可以执行简单的加法

public class Service : Mutator
{

    public int AddTwoNumbers(int firstNum, int secondNum)
    {
        return firstNum + secondNum;
    }
}

起初,我只是尝试编写Mutator类,如下所示:

 public class Mutator
 {
     public static int operator +(int a, int b)
     {
         return a - b;
     }
 }

但当然很快发现以下代码会产生编译器错误(“二元运算符的参数之一必须是包含类型”)

所以我想知道,是否有一种方法可以通过继承来实现这种突变而不改变实际的Service类。

我选择运算符重载而不是方法重载或类似的东西的原因是因为我希望能够从任何随机类继承这个 Mutator 并且只需将所有 + 更改为 -

c# inheritance operator-overloading mutation-testing
1个回答
1
投票

它告诉您运算符参数之一需要是重载类本身的类型。

operator+
重载必须具有
Mutator
类型的参数。

你想做的事情对于所有类型来说本质上都是不可能的,因为:

  1. 任何类型都可以根据需要实现减法,
  2. 不能保证 + 和 - 运算符首先被类型重载,并且
  3. 运算符重载必须具有与重载它们的类型匹配的参数。

但是,在某种程度上实现这一目标是可能的。您可以将 Mutator 实现为泛型,并向其添加约束,以便您知道派生类型将具有可以交换的加法或减法。不过,您无法单独使用通用 T 作为参数。 Mutator 必须是一个包装类。这是一个例子:

public static void Main()
{
    var origin = new Mutator<long>(10L);
    var x = origin + 3; // 7
    var y = origin - 3; // 13

    Console.WriteLine($"origin: {origin.Value}");
    Console.WriteLine($"x: {x}");
    Console.WriteLine($"y: {y}");
}

class Mutator<T>(T value)
    where T : IAdditionOperators<T, T, T>, ISubtractionOperators<T, T, T>
{
    public T Value { get; set; } = value;

    public static T operator +(Mutator<T> x, T y)
        => x.Value - y;

    public static T operator -(Mutator<T> x, T y)
        => x.Value + y;
}

© www.soinside.com 2019 - 2024. All rights reserved.