오래된 테스트를 거친 몇 개의 클래스에서 몇 가지 메소드를 사용하여 새로운 클래스로 만들고 싶습니다. 불행히도 C#은 다중 상속을 지원하지 않습니다. 이전 클래스의 코드를 어떻게 재사용합니까? 나는 그것들을 멤버 객체로서 만 생성합니까? 또는 다른 옵션이 있습니까?다중 상속이 옵션이 아닌 경우 코드를 재사용하는 방법은 무엇입니까?
답변
일반적으로 상속 대신 컴포지션을 사용하는 것이 앞으로의 길입니다. 당신이 의미하는 것과 같은 구체적인 예를들 수 있다면 적절한 접근법을 찾는 것을 더 쉽게 도와 줄 것입니다 : 항상 같은 것은 아닙니다. 당신이 구성 요소로 개발 한 경우 구성원 개체 좋은 생각해야으로
, 그들을 사용하여
에서 inherite 해달라고 사용합니다. 그런 다음 관심있는 방법 만 노출하고 필요한 경우 적용 할 수 있습니다.
.NET의 대리자가 약간 혼란 스러울 수도 있지만 위임 패턴이라고합니다. – Thorarin
동일한 유형에서 작업 할 때 확장 방법으로 다시 만들 수 있습니다. 아래에 언급 당신이합니다 MyType에서 파생 이상의 공통 확장 방법에 작동하는 인터페이스를 구현하는 클래스가있는 경우, 확장이 사람들을 위해 작동하기 때문에
public static void MyMethod(this MyType target){}
MyType.MyMethod()
.
public class MyDerived : MyType{}
MyDerived.MyMethod()
할 수 있습니다 가짜 아주 쉽게 이런 식으로 :
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();
기술적으로, C#을 여러 인터페이스 상속하지만 구현 상속 배수가 아닌를 구현합니다.
복수 구현 상속의 문제점은 the diamond problem과 같은 상황 인 으로 연결된다는 것입니다.
당신은 당신이 "구성원 개체로"를 다시 사용 할 객체를 생성 설명 무엇에 가까운 여러 인터페이스 상속 및 조성물을 사용하여 여러 구현 상속을 시뮬레이션 할 수 있습니다. 을 사용하지 않으려면 포장 된 유형에서 불필요한 동작이 표시됩니다.
Multiple Inheritance http://www.freeimagehosting.net/uploads/cb219cefba.jpg
이것의 단점은 그 Breeper에 대응 변경을 필요 IBreeper 인터페이스로 변경하고 : 다음
는상속 조성물을 복수의 기본 원리를 나타내는 클래스 다이어그램 그 반대의 경우도 마찬가지입니다.
이전 단계를 다시 생각해보십시오. 이전 클래스를 구성하는 이유는 신중히 살펴 봐야합니다. 다음과 같습니다.
기존 동작을 향상 시키거나 단계적으로 향상시킵니다. 그런 다음 Proxy Pattern을 고려해야합니다.
모든 행동에 대해 "원 스톱 쇼핑"을 만듭니다.SuperFuddler이 응집력이있는 인 경우 (즉, 모든 노출 된 동작이 정렬 된 경우)에만 수행해야합니다. 그렇지 않으면 유지 관리가 불가능한 God Object 상황으로 이동하게됩니다.
SuperFuddler의 특정 클라이언트 클래스에서 요구하는 사용 모드와 더 일치하는 인터페이스를 제공하십시오. 이 경우 Adapter Pattern을 고려해야합니다.
- 1. 트리의 노드에 다중 상속이 허용됩니까?
- 2. 난류를 재사용하는 방법은 무엇입니까?
- 3. Perl과 Java의 다중 상속이 동일합니까?
- 4. 다중 상속이 필요한 시나리오가 있습니까?
- 5. Windows 인증이 옵션이 아닌 경우 MS-SQL의 모범 사례는 무엇입니까?
- 6. SSL이 옵션이 아닌 경우 가장 좋은 WCF 보안 모드는 무엇입니까
- 7. 예외를 던져서 부울을 반환하는 코드를 재사용하는 방법은 무엇입니까?
- 8. Xcode & iPhone - 여러 프로젝트에서 코드를 재사용하는 가장 좋은 방법은 무엇입니까?
- 9. Obj-C의 다른 클래스에서 코드를 재사용하는 가장 좋은 방법은 무엇입니까?
- 10. PHP와 MySQL의 경우 연결을 재사용하는 올바른 방법은 무엇입니까?
- 11. 왜 코코아는 상속이 아닌 대리자를 사용합니까?
- 12. 옵션이 아닌 xml 속성 만 표시하는 방법은 무엇입니까? C에서 #
- 13. 동일한 변수를 다른 유형으로 재사용하는 방법은 무엇입니까?
- 14. 다른보기에서 동일한 테이블보기를 재사용하는 방법은 무엇입니까?
- 15. 두 가지 활동에서 웹보기를 재사용하는 방법은 무엇입니까?
- 16. 배열에서 요소를 재사용하는 가장 좋은 방법은 무엇입니까?
- 17. enterEventDispatcher를 사용하지 않는 경우 블랙 베리 앱을 입력하는 방법은 무엇입니까?
- 18. OPTIMIZE 옵션이 다중 명령문 테이블 함수에서 작동합니까?
- 19. ASP.net 응용 프로그램이 아닌 경우 AutoMapper를 구성하는 방법은 무엇입니까?
- 20. 웹 서비스를 다른 장소로 옮길 때 스텁을 재사용하는 방법은 무엇입니까?
- 21. Ruby on Rails의 컨트롤러간에 코드를 재사용하는 모범 사례
- 22. 상속이 나 빠졌습니까?
- 23. null을 반환하는 Regex.MatchData : [String] 옵션이 아닌 이유는 무엇입니까?
- 24. 이 핫스팟 JVM 옵션이 기본값이 아닌 이유는 무엇입니까? -XX : + PrintConcurrentLocks
- 25. 라틴어 문자가 아닌 경우
- 26. 가상 상속이 "다이아몬드"(다중 상속) 모호성을 어떻게 해결합니까?
- 27. 트랜잭션 종속 코드를 트랜잭션이 아닌 코드로 변환하는 방법은 무엇입니까?
- 28. XAML에서 응용 프로그램의 일부를 디자인하고 재사용하는 방법은 무엇입니까?
- 29. modulr을 사용하여 브라우저와 서버에서 commonjs 모듈을 재사용하는 방법은 무엇입니까?
- 30. JS에서 상속이 작동하지 않습니까?
** FORTUNATELY ** C#은 다중 상속을 지원하지 않습니다! –
MI가 지원되는지 여부에 관계없이 * 모든 언어의 코드 재사용을 위해 상속을 사용하면 안됩니다. – jalf
@ jalf : 왜 안 되니? 상속은 강력한 기능입니다. 논란의 여지가있다 : C# DID가 다중 상속을 지원한다면 좋을까요? –