2009-07-29 3 views
1

오래된 테스트를 거친 몇 개의 클래스에서 몇 가지 메소드를 사용하여 새로운 클래스로 만들고 싶습니다. 불행히도 C#은 다중 상속을 지원하지 않습니다. 이전 클래스의 코드를 어떻게 재사용합니까? 나는 그것들을 멤버 객체로서 만 생성합니까? 또는 다른 옵션이 있습니까?다중 상속이 옵션이 아닌 경우 코드를 재사용하는 방법은 무엇입니까?

+11

** FORTUNATELY ** C#은 다중 상속을 지원하지 않습니다! –

+3

MI가 지원되는지 여부에 관계없이 * 모든 언어의 코드 재사용을 위해 상속을 사용하면 안됩니다. – jalf

+0

@ jalf : 왜 안 되니? 상속은 강력한 기능입니다. 논란의 여지가있다 : C# DID가 다중 상속을 지원한다면 좋을까요? –

답변

11

일반적으로 상속 대신 컴포지션을 사용하는 것이 앞으로의 길입니다. 당신이 의미하는 것과 같은 구체적인 예를들 수 있다면 적절한 접근법을 찾는 것을 더 쉽게 도와 줄 것입니다 : 항상 같은 것은 아닙니다. 당신이 구성 요소로 개발 한 경우 구성원 개체 좋은 생각해야으로

-1

, 그들을 사용하여

4

에서 inherite 해달라고 사용합니다. 그런 다음 관심있는 방법 만 노출하고 필요한 경우 적용 할 수 있습니다.

+0

.NET의 대리자가 약간 혼란 스러울 수도 있지만 위임 패턴이라고합니다. – Thorarin

4

동일한 유형에서 작업 할 때 확장 방법으로 다시 만들 수 있습니다. 아래에 언급 당신이합니다 MyType에서 파생 이상의 공통 확장 방법에 작동하는 인터페이스를 구현하는 클래스가있는 경우, 확장이 사람들을 위해 작동하기 때문에

public static void MyMethod(this MyType target){} 


MyType.MyMethod() 

.

public class MyDerived : MyType{} 

MyDerived.MyMethod() 
+0

이것이 코드를 재사용하는 데 어떻게 도움이됩니까? 새 클래스의 확장 메서드를 정의해야합니까? – Thorarin

+1

그러나 제네릭 형식이나보다 일반적인 인터페이스에 대해 정의 될 수 있으므로 많은 확장 클래스에서 동일한 확장 메서드를 다시 사용할 수 있습니다. – jalf

0

할 수 있습니다 가짜 아주 쉽게 이런 식으로 :

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(); 
2

기술적으로, C#을 여러 인터페이스 상속하지만 구현 상속 배수가 아닌를 구현합니다.

복수 구현 상속의 문제점은 the diamond problem과 같은 상황 인 으로 연결된다는 것입니다.

당신은 당신이 "구성원 개체로"를 다시 사용 할 객체를 생성 설명 무엇에 가까운 여러 인터페이스 상속 및 조성물을 사용하여 여러 구현 상속을 시뮬레이션 할 수 있습니다. 을 사용하지 않으려면 포장 된 유형에서 불필요한 동작이 표시됩니다.

Multiple Inheritance http://www.freeimagehosting.net/uploads/cb219cefba.jpg

이것의 단점은 그 Breeper에 대응 변경을 필요 IBreeper 인터페이스로 변경하고 : 다음

상속 조성물을 복수의 기본 원리를 나타내는 클래스 다이어그램 그 반대의 경우도 마찬가지입니다.

이전 단계를 다시 생각해보십시오. 이전 클래스를 구성하는 이유는 신중히 살펴 봐야합니다. 다음과 같습니다.

  1. 기존 동작을 향상 시키거나 단계적으로 향상시킵니다. 그런 다음 Proxy Pattern을 고려해야합니다.

  2. 모든 행동에 대해 "원 스톱 쇼핑"을 만듭니다.SuperFuddler응집력이있는 인 경우 (즉, 모든 노출 된 동작이 정렬 된 경우)에만 수행해야합니다. 그렇지 않으면 유지 관리가 불가능한 God Object 상황으로 이동하게됩니다.

  3. SuperFuddler의 특정 클라이언트 클래스에서 요구하는 사용 모드와 더 일치하는 인터페이스를 제공하십시오. 이 경우 Adapter Pattern을 고려해야합니다.

관련 문제