완벽한 인터페이스를 만들기 위해 확장 방법을 사용합니다.어떻게</p> <pre><code>interface IFoo { void Do(); void Stuff(); } </code></pre> <p>이 (레거시) 클래스 FOO1, FOO2, Foo3 모든 IFoo가 구현하는 가정 해 봅시다 IFoo 인터페이스 주어
물건은 IFoo의 일부 방법을 사용하거나 더 새로운 클래스의 경우 DoStuff()를 사용하여 수행 할 수 있습니다. 사실, IFoo에서 DoStuff()가 "잊어 버린 것"처럼 보일 수 있습니다.
IFoo2를 구현 한 새로운 클래스 FooX (FooY, ...)가 있으며, 여기에는 DoStuff() 메서드가 있습니다.
IFoo 개체를 허용하고 해당 개체에 "할 일"을 할 수 있어야합니다.
//Let us assume foos = new IFoo[] {new Foo1(), new Foo2(), new Foo3(), new FooX()};
void MyMethod(IFoo[] foos){
foreach(foo in foos){
//DoStuff is not defined in IFoo
foo.DoStuff();
}
}
그래서, 난 그냥도 FooX를 들어, 기존의 클래스
public static DoStuff(this IFoo self){
self.Do();
self.Stuff();
}
불행하게도,이 확장 방법은 항상 호출
에 대한 IFoo에 확장 메서드 DoStuff()를 정의로 생각했다.내가 그러나
public static DoSomeStuff(this IFoo self){
if(self is IFoo2) {
(self as IFoo2).DoStuff()
} else {
self.Do();
self.Stuff();
}
}
void MyMethod(IFoo[] foos){
foreach(foo in foos){
foo.DoSomeStuff();
}
}
같은 일을 할 수 방법은 현재 아직, 레거시 프로젝트에 IFoo2 알고있는 MyMethod라는. IFoo2를 사용하지 않고도 해결책을 찾을 수 있습니까?
'불행하게도,이 확장 방법을 항상 심지어 FooX.'를 들어,라고 왜 문제가 있다는 것입니다? – Servy
입니다. 왜냐하면 최신 클래스의 DoStuff()가 Do()로 구현 될 필요가 없기 때문입니다. 물건(); –
그러면 의미 상으로 확장되는'IFoo'가 아니며 확장하지 않아야합니다. 또한'IFoo' 인스턴스를 기대하는 메소드에 전달해야합니다. 왜냐하면 그 계약을 제공 할 수 없기 때문입니다. – Servy