私は「レガシー コードを効果的に使用する」という本を読んでおり、単体テストでテストが難しいメソッドを偽の作成によってオーバーライドするという概念をいじっています。うまくいくと思った例をまとめたところ、予想とは異なる動作になりました。C# で継承とメソッドのオーバーロードがどのように機能するかについての理解に穴を発見したと思います。
私は次のインターフェースを持っています:
public interface IAnimal
{
void MakeSound();
void Move();
}
次に、動物インターフェイスの実装を次のように作成します。
public class Dog : IAnimal
{
public void MakeSound()
{
Console.WriteLine("Woof");
}
public void Move()
{
Console.WriteLine("Moved");
}
}
このクラスを次のように使用すると:
IAnimal myanimal = new Dog();
myanimal.MakeSound();
myanimal.Move();
次の出力が得られます。
ここで、Dog クラスの単体テストを行う必要があるとしますが、メソッドの 1 つである MakeSound() をオーバーライドする必要があります。これは、クラスのテストが何らかの理由で困難になっているためです。
Dog クラスを拡張し、MakeSound のメソッドを作成して、偽の犬を作成します。
public class FakeDog : Dog
{
public void MakeSound()
{
Console.WriteLine("Bark");
}
}
このクラスを次のように使用すると:
IAnimal myanimal = new FakeDog();
myanimal.MakeSound();
myanimal.Move();
次の出力が得られます。
私はそれが次のようになると予想していました: Bark Moved
ただし、FakeDog クラスにアニマル インターフェイスを実装して使用させると、次のようになります。
public class FakeDog : Dog, IAnimal
{
public void MakeSound()
{
Console.WriteLine("Bark");
}
}
次の出力が得られます: Bark Moved
Dog クラスを拡張したばかりのときに期待していたように、これがメソッドをオーバーライドする理由を理解したいだけです。誰かがこれについて私をまっすぐに設定できますか?