문제

나는 구식 테스트 수업 몇 개에서 내가 구축하는 새로운 수업으로 몇 가지 방법을 사용하고 싶습니다. 불행히도 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에 대한 해당 변경이 필요하다는 것입니다.

한 걸음 물러서서 - 구식 수업을 작성하는 이유를주의 깊게 살펴 봐야합니다. 그것은 다음과 같습니다.

  1. 기존 행동을 강화하거나 강화합니다. 그런 다음 고려해야합니다 프록시 패턴;

  2. 모든 행동을 위해 "원 스톱 상점"을 만듭니다. 당신은 정말로 당신의 경우에만 그렇게해야합니다 슈퍼 퍼들러 ~이다 결합력 있는 (즉, 모든 노출 된 행동이 정렬됩니다) 그렇지 않으면 당신은 신의 대상 유지하기에 도움이되지 않는 상황;

  3. 슈퍼 푸더의 특정 클라이언트 클라이언트가 요구하는 사용 모드와 더 일치하는 인터페이스를 제시하십시오. 이 경우 고려해야합니다 어댑터 패턴.

당신은 다음과 같이 쉽게 가짜 할 수 있습니다.

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

구성 요소로 개발 한 경우 사용하지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top