메소드를 재정의하는 이유는 인터페이스를 구현 한 후에 만 ​​발생합니까?

StackOverflow https://stackoverflow.com/questions/2243830

문제

나는 레거시 코드로 효과적으로 작업하는 책을 읽고 있으며 가짜 생성을 통해 단위 테스트에서 방법을 테스트하기 어려운 개념을 가지고 놀았습니다. 나는 내가 생각했던 것의 예를 모았고 결국 내가 기대했던 것과 다르게 행동하게되었습니다. 나는 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();

다음 출력을 얻습니다. 우프가 움직였습니다

이제 개 클래스를 단위 테스트해야한다고 가정하자. Modeound () 중 하나 인 Mostound ()는 클래스를 어떤 이유로 테스트하기가 어렵 기 때문에 무시해야합니다.

나는 개 수업을 확장하고 mostound에 대한 메소드를 만들어 가짜 개를 만듭니다.

public class FakeDog : Dog
{
    public void MakeSound()
    {
         Console.WriteLine("Bark");
    }
}

이 클래스를 다음과 같이 사용할 때 :

IAnimal myanimal = new FakeDog();
myanimal.MakeSound();
myanimal.Move();

다음 출력을 얻습니다. 우프가 움직였습니다

나는 그것을 기대하고 있었다 : 껍질이 움직였다

그러나 Fakekog 클래스가 동물 인터페이스를 구현하고 사용하도록하는 경우 :

public class FakeDog : Dog, IAnimal
{
    public void MakeSound()
    {
         Console.WriteLine("Bark");
    }
}

나는 다음과 같은 출력을 얻는다 : 껍질이 움직였다

나는 개 수업을 방금 확장했을 때 기대했던 것처럼 이것이 이제이 방법을 무시하는 이유를 이해하고 싶다. 누구든지 나를 똑바로 세울 수 있습니까?

도움이 되었습니까?

해결책

첫 번째 경우에는 새로운 방법을 만들고 있습니다. 가죽 원래 구현 IAnimal.MakeSound. 당신은 당신이 당신이 new 이것을 명시 적으로 만드는 키워드.

두 번째 경우에는 당신이 있습니다 재 구현 IAnimal. 인터페이스를 구현하려면 필요하지 않습니다 override 키워드 (언어 디자이너가 좋았을 수도 있지만 가졌다 필요).

인터페이스를 다시 구현하지 않으려면 만들 수 있습니다 MakeSound 가상 Dog, 그런 다음 명시 적으로 무시하십시오 FakeDog. 그 시점에서 가능한 해상도는 하나 뿐이며 모든 것이 이해하기가 더 간단합니다. 가능할 때마다 상환과 방법 숨기기를 피하려고 노력합니다.

다른 팁

(질문에 대답하여 죄송하지만,이 실험에 진정으로 정보를 찾을 수 있습니다) 개를 구현할 때 어떻게되는지 :

public class Dog : IAnimal
{

public virtual void MakeSound()
{
    Console.WriteLine("Woof");
}

//...

"가상"에 주목하십시오

당신은 선언해야합니다 MakeSound 방법 virtual 에서 Dog 수업 및 우세하다 그것은 FakeDog 수업:

public class Dog : IAnimal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Woof");
    }

    public virtual void Move()
    {
        Console.WriteLine("Moved");
    }
}

public class FakeDog : Dog
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top