用C#替换类实现

Bet*_*moo 3 .net c# visual-studio

我可以用自己的实现替换(或覆盖)类定义吗?

说明:

  • 我有一个带有System.Random实例的类,我试图在不修改原始代码的情况下测试它...
  • 所以我打算用我自己的一个实现替换Random类,它允许控制生成的序列..请看这个问题.

`

class foo
{
    Random r=new Random();
    double bar()
    {
         double ans=r.NextDouble();
         .....// evaluate ans
         return ans;
    }
}
Run Code Online (Sandbox Code Playgroud)

`

有什么方法可以用另一个替换Random类的实现而不改变(或用最小的改动)原始代码文件?

编辑:
一个解决方案是继承Random类并修改它...但是这需要用继承的实例更改每个Random实例...我不想修改代码,因为我只是测试它!
编辑2:
我可以在C#中说:"这个文件中的每个随机类都是MyNamespace.Random而不是System.Random"?

Lee*_*Lee 5

编辑:正如ChaosPandion指出的那样,为了测试方法中的逻辑,最好采用双参数double bar(double input) { ... },但如果你有理由需要注入自己的random源,你可以使用以下方法之一:

您可以修改bar Func<double>以获取以下值:

double bar(Func<double> source)
{
    double ans = source();
    //evaluate ans
    return ans;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以注入自己的实现进行测试,并在主程序中使用:

Random r = new Random();
double ans = bar(r.NextDouble);
Run Code Online (Sandbox Code Playgroud)

或者,您可以创建自己的IRandom接口,然后围绕真实Random类实现包装并使用模拟进行测试:

interface IRandom
{
    double Next();
}

public class RandomWrapper : IRandom
{
    private Random r = new Random();
    public double Next()
    {
        return this.r.NextDouble();
    }
}
Run Code Online (Sandbox Code Playgroud)