다중 상속이 옵션이 아닌 경우 코드를 재사용하는 방법은 무엇입니까?
-
05-07-2019 - |
문제
나는 구식 테스트 수업 몇 개에서 내가 구축하는 새로운 수업으로 몇 가지 방법을 사용하고 싶습니다. 불행히도 C#은 다중 상속을 지원하지 않습니다. 이 구식 클래스에서 코드를 재사용하려면 어떻게해야합니까? 회원 객체로 만들나요? 아니면 다른 옵션이 있습니까?
해결책
일반적으로 상속 대신 구성을 사용하는 것은 앞으로 나아갈 길입니다. 당신이 의미하는 종류의 구체적인 예를 제시 할 수 있다면, 적절한 접근 방식을 쉽게 찾는 데 도움이 될 것입니다. 항상 동일하지는 않습니다.
다른 팁
멤버 객체로 사용하는 것이 좋은 생각이어야합니다. 그런 다음 관심있는 방법 만 노출하고 필요한 경우 적응할 수 있습니다.
동일한 유형에서 작업 할 때 확장 방법으로 재현 할 수 있습니다.
public static void MyMethod( this MyType target ){}
MyType.MyMethod()
아래에 언급 된 바와 같이, myType에서 파생 된 클래스가 있거나 더 일반적인 구현이 작동하는 인터페이스가 작동하는 경우, 확장자가 이들을 위해 작동합니다.
public class MyDerived : MyType{}
MyDerived.MyMethod()
기술적으로 C#은 여러 가지를 구현합니다 상호 작용 내유, 다수는 아닙니다구현 내유.
다중 구현 내유의 문제는 그것이 다음과 같은 상황으로 이어진다는 것입니다. 다이아몬드 문제.
다중 인터페이스 상속 및 구성을 사용하여 다중 구현 내속을 시뮬레이션 할 수 있으며, 이는 "멤버 객체"로 재사용하려는 객체를 작성하는 것으로 설명 된 내용에 가깝습니다. 그러나 원하지 않는 것은 래핑 된 유형에서 불필요한 행동을 드러내는 것입니다.
다음은 구성을 통한 다중 유전의 기본 원리를 보여주는 클래스 다이어그램입니다.
다중 상속 http://www.freeimagehosting.net/uploads/cb219cefba.jpg
이것의 단점은 Ibreeper 인터페이스에 대한 모든 변경 사항이 Breeper에 대한 해당 변경이 필요하다는 것입니다.
한 걸음 물러서서 - 구식 수업을 작성하는 이유를주의 깊게 살펴 봐야합니다. 그것은 다음과 같습니다.
당신은 다음과 같이 쉽게 가짜 할 수 있습니다.
public interface IFoo {
void DoFoo();
}
public class Foo : IFoo {
public void DoFoo() { Console.Write("Foo"); }
}
public class Bar {
public void DoBar() { Console.Write("Bar"); }
}
public class FooBar : IFoo, Bar {
private IFoo baseFoo = new Foo();
public void DoFoo() { baseFoo.DoFoo(); }
}
//...
FooBar fooBar = new FooBar();
fooBar.DoFoo();
fooBar.DoBar();
구성 요소로 개발 한 경우 사용하지 마십시오.