为什么我们将接口实例化为 'ISudokuStrategy _simpleMarkupStrategy = new SimpleMarkUpStrategy(new SudokuMapper());'?

why are we Instantiating an interface as 'ISudokuStrategy _simpleMarkupStrategy = new SimpleMarkUpStrategy(new SudokuMapper());'?

我在之前的提问中找不到合适的答案。 下面是我的数独求解器的单元测试代码。在这个应用程序中,我有一个界面 'ISudokuStrategy'。只有两个 类 继承了 'ISudokuStrategy':'SimpleMarkUpStrategy' 和 'NakedPairsStrategy'。我的问题是为什么我们将接口实例化为

private readonly ISudokuStrategy _simpleMarkupStrategy = new SimpleMarkUpStrategy(new SudokuMapper());

为什么不

private readonly SimpleMarkUpStrategy _simpleMarkupStrategy = new SimpleMarkUpStrategy(new SudokuMapper());

这是我的单元测试

[TestClass]
public class SimpleMarkupStrategyTest
{
    private readonly ISudokuStrategy _simpleMarkupStrategy = new SimpleMarkUpStrategy(new SudokuMapper());

    [TestMethod]
    public void SimpleStrategyShouldSolveAlmostCompletedForTopLeftCell() 
    {
        int[,] sudokuBoard =
        {
            {0,1,2,3,9,8,4,7,5 },
            {5,3,8,4,1,7,6,2,9 },
            {4,7,9,5,6,2,3,1,8 },
            {9,6,7,2,8,4,1,5,3 },
            {3,8,4,6,5,1,7,9,2 },
            {2,5,1,7,3,9,8,6,4 },
            {8,2,5,1,4,6,9,3,7 },
            {1,9,3,8,7,5,2,4,6 },
            {7,4,6,9,2,3,5,8,1 }
        };

        var solvedSudokuBoard = _simpleMarkupStrategy.Solve(sudokuBoard);

        Assert.IsTrue(solvedSudokuBoard[0, 0] == 6);
    }
}

好吧,是你在写代码,所以……你为什么?我们无法告诉您为什么您的代码看起来像它。

应该做的是将其设为单元测试的本地变量:

[TestClass]
public class SimpleMarkupStrategyTest
{
    [TestMethod]
    public void SimpleStrategyShouldSolveAlmostCompletedForTopLeftCell() 
    {
        var simpleMarkupStrategy = new SimpleMarkUpStrategy(new SudokuMapper());

        int[,] sudokuBoard =
        {
            {0,1,2,3,9,8,4,7,5 },
            {5,3,8,4,1,7,6,2,9 },
            {4,7,9,5,6,2,3,1,8 },
            {9,6,7,2,8,4,1,5,3 },
            {3,8,4,6,5,1,7,9,2 },
            {2,5,1,7,3,9,8,6,4 },
            {8,2,5,1,4,6,9,3,7 },
            {1,9,3,8,7,5,2,4,6 },
            {7,4,6,9,2,3,5,8,1 }
        };

        var solvedSudokuBoard = simpleMarkupStrategy.Solve(sudokuBoard);

        Assert.IsTrue(solvedSudokuBoard[0, 0] == 6);
    }
}

这样你就不会意外破坏其他单元测试,在它们之间共享一个变量。

正如您所见,作为局部变量,它甚至可以与 var 类型一起使用,并让编译器确定它是什么类型。

它做的一件事是确保您的 class 实现了该接口。但我会假设整个程序无论如何都不会编译,如果你决定删除它。