는 가정이 두 클래스로 시작 :이것은 소프트웨어 디자인 패턴입니까?
public class Foo{
public virtual Baz Bar(){
return GetStandardBaz();
}
}
public class Qux: Foo{
public virtual Baz Bar(){
return GetQuxBaz();
}
}
지금 Bar
가 호출 될 때 그것을 반환하기 전에 Baz
에 뭔가를까지 요구가 온다 말할 수 있습니다. 나는 virtual protected
방법을 만들고, 그래서 같은 공공 방법에서 virtual
을 제거하는 것입니다 :
public class Foo{
public Baz Bar(){
var value = BarInternal();
DoSomethingFirst(value);
return value;
}
protected virtual Baz BarInternal(){
return GetStandardBaz();
}
}
public class Qux: Foo{
protected override Baz BarInternal(){
return GetQuxBaz();
}
}
이렇게하면 그 때마다 Bar
GET의라는 결과 Baz
가 반환되기 전에 DoSomethingFirst
로 전달됩니다. 예, 이것은 모든 하위 클래스의 주요 변경 사항이지만 어떤 호출 사이트도 업데이트 할 필요가 없습니다. Bar
.
표준 디자인 패턴입니까? 제가 누락 된 더 좋은 방법이 있습니까? 또한 Internal
보다 나은 수정 후 이름이 있는지 궁금합니다.
Baz2 (또는 NewBaz 또는 기타) 메소드를 기본 클래스에 추가하지 않는 이유가 있습니까? 그렇게하면 부서지는 변화를 피할 수 있습니다. 명명 규칙에서 "내부"는 끔찍한 것이 아닙니다. "Impl"도 일반적입니다. – ThatBlairGuy
'Qux'에서'override'를 의미합니까? – dtb
내 질문에 대답 - Baz()를 호출하는 장소에 영향을주지 않는 요구 사항은 유효하지 않습니다. Baz()를 호출하는 파생 클래스의 메서드는 변경해야하며 상황 (예 : 라이브러리를 사용하는 다른 사람)에 따라 해당 코드에 액세스하지 못할 수도 있습니다. 새로운 행동으로 새로운 방법을 추가하는 것이 더 나은 방법입니다. – ThatBlairGuy