재정의 된 메서드 내부 호출

. 그러나 재정의 된 메서드가 기본 클래스 만 호출하면 어떻게 될까요? 이것은 나쁜 / 좋은 행동입니까? 이상하게 보이지만 어쨌든 기본을 호출하기 위해 메소드를 재정의하는 이유는 무엇입니까?

예 :

public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } } 

댓글

  • 용도없이 코드를 복잡하게 만들 뿐이므로 제거합니다.
  • @DavidArno that '도 생각했습니다. ' 그 이유가 없는지 확인하기 전에
  • 이상적인 세상에서 앱은 따라서 단위 테스트를 제거 할 수 있으며 테스트가 모두 통과되면 ' 필요하지 않음을 ' 알 수 있습니다. 우리는 ' 항상 이상적인 세상에 살고있는 것은 아니므로 물어 보는 것이 현명했습니다. 🙂
  • 제가 유일한 이유 ' d 이전에 오버라이드 된 메소드에 더 많은 코드가 있었을 경우 위와 같이 코드를 남겨두고 제거했지만 소스 제어 시스템에서 이전 버전을 통해 볼 수있었습니다. 이와 같이 현재 코드에 아티팩트를 남겨두면 오늘 개발자에게 이전 버전의 메소드에 대한 파일 ' 기록을 볼 수 있습니다.

답변

하지만 재정의 된 메서드가 기본 클래스 만 호출하면 어떻게 될까요? 이 디자인이 나쁘거나 좋은가요?

디자인 이 나쁩니 까? 아니, 오히려 나쁜 구현입니다. 유지 보수 프로그래머에게는 오해의 소지가 있습니다. 재정의가 보이지 않으면베이스가 호출된다는 것을 알고 합니다. 재정의는 기지가 거기에서도 호출 되더라도 뭔가 다른 것이 있음을 알려줍니다.


템플릿없이베이스를 호출하기 위해 재정의를 요구하는 것은 잘못된 설계입니다.

참조 된 스레드-가장 인기있는 answser

스칸디나비아 재정의에 대한 초기 반응 모델 : 코딩 공포! “하위 동작”이 내 코드를 손상시키지 않고 그 반대의 경우도 마찬가지인지 확인하기 위해이 모든 것을 읽어야하는 것 같습니다.

템플릿 메서드 패턴 은 더 큰 코드 흐름 내에서 변수 코드를 표현하고 올바른 실행 순서를 보장하는 좋은 방법입니다.

내 경험상 서브 클래스가 알아야하는 것은 매우 일반적입니다. 호출 할 기본 선언 메서드 및 순서. 동일한 cut-n-paste 제어 구조를 가진 수많은 하위 클래스를 가져와 5 년의 유지 관리를 추가합니다. 이제 제가 101 증명 Wild Turkey 를 선호하는 이유를 이해하셨습니다.

P.S. 이것이 제가 abstract 수업 대신 interface의 남용을 막는 큰 이유 중 하나입니다.

주석

  • C #에서 인터페이스의 과도한 사용은 구현자를 특정 추상 기본 클래스로 묶고 싶지 않기 때문에 발생했을 가능성이 높습니다. 인터페이스를 사용하면 구현자가 특정 추상 클래스뿐만 아니라 다른 기본 클래스를 구현할 수 있습니다. 하지만 상황에 따라 많이 달라집니다. 좋은 방법은 IFoo 인터페이스와 IFoo

클래스를 모두 갖는 것입니다.

인터페이스, 메서드에 대한 추상 메서드 호출과 소품에 대한 자동 속성. 배우도 참여시킬 수 있습니다.

답변

IMO, virtual 메서드는 기본 클래스에서 매우 기본적인 구현을 갖습니다. 하위 클래스에서 override virtual 메서드 정의를 수행하더라도 virtual 메서드 (기본 구현 포함)는 의미가 있으며 하위 클래스에서 overridden 메서드의 의도 된 동작에 영향을주지 않습니다.

예 : BaseCalculator 진짜 일을합니다. 계산기는 BaseCalculator 라이브러리를 확장하여 꾸미고 있습니다.

public class BaseCalculator { public virtual T Add<T>(T number01, T number02) { return number01 + number02; } } public class Calculator: BaseCalculator { public override T Add<T>(T number01, T number02) { Console.WriteLine(number01 + " | " + number02); var result = base.Add<int>(1, 3); Console.WriteLine("Result: "+ result); return result; } } 

Q : 재정의 된 메서드가 기본 클래스 만 호출하면 어떻게됩니까?

A : 귀하의 경우 기본 클래스 메서드를 virtual, 동작을 변경하기 전까지는 override 필요하지 않습니다.

Q :이게 나쁜 / 좋은 행동인가요?

A : 예, 불필요한 재정의를 추가하는 동안 소스 코드 파일이 어수선해질 수 있으므로 설계가 잘못 될 수 있습니다.

Q : 이상하게 보이지만 어쨌든 기본을 호출하기 위해 메서드를 재정의하는 이유는 무엇입니까?

A : BaseCalculator가 실제 작업을 수행합니다. . 계산기가 BaseCalculator 라이브러리를 확장하여 꾸미고 있습니다.

도움이 되길 바랍니다!

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다