2009-06-01 3 views
3

첫 번째 질문은 여기에 있습니다. 잘하면 모두 나를 부드럽게 감동시킬 것입니다!C#에서 다형성을 구현하는 가장 좋은 방법은 무엇입니까?

나는 다형성에 대해 지난 며칠 동안 몹시 많이 읽었고, 그것을 C#에서하는 일에 적용하려고 시도했다. 그리고 그것을 구현하는 몇 가지 다른 방법이있는 것으로 보인다. 나는이 문제를 다루기를 희망하지만, 내가 명확히하지 않아도 기뻐할 것입니다.

내가 무엇을 볼 수에서

, 나는 3 가지 옵션을 가지고 :

  1. 난 그냥 기본 클래스에서 상속과 내 파생 클래스를 원하는 그 어떤 방법에 키워드를 'virtual'사용할 수 있습니다 ~ 으로 대체하십시오.
  2. 가상 메서드 을 사용하여 추상 클래스를 구현할 수 있으며 그 방법으로 수행 할 수 있습니다.
  3. 인터페이스를 사용할 수 있습니까?

베이스에서 구현 로직을 필요로하지 않는다면 인터페이스가 가장 유연성이 있습니다 (다중 상속과 관련하여 자신을 제한하지 않음). 하지만 만약 파생 된 클래스가 무엇을 하든지간에 무엇인가 할 수있는 기반을 필요로한다면, 1 또는 2로가는 것이 더 나은 해결책이 될 것입니다. 이 사람에 대한 모든 입력에 대한

감사합니다 -이 사이트에 다른 곳에서 모두, 너무 많은 주말을 읽고, 그리고 내가 지금 접근 방법을 이해하고, 아직 난 그냥 언어 별 방법 경우에 명확하게 할 생각 나는 바른 길을 가고있다. 잘하면이 태그를 제대로 붙 였으면합니다.

건배, 테리

답변

6

인터페이스는 가장 추상화를 제공합니다. 특정 구현에 묶여 있지 않습니다 (구현시 다른 기본 클래스가 있어야하는 경우 유용합니다).

실제 다형성의 경우 virtual은 필수 항목입니다. 다형성은 가장 일반적으로

당신은 물론 두 개의 혼합 할 수 있습니다 ... 타입의 서브 클래스와 연관된 :

public interface IFoo { 
    void Bar(); 
} 
class Foo : IFoo { 
    public virtual void Bar() {...} 
} 
class Foo2 : Foo { 
    public override ... 
} 

abstract는 별도의 문제입니다; abstract의 선택은 실제로 : 그것은 기본 클래스에 의해 현명하게 정의 될 수 있습니까? 기본 구현이 없으면 abstract이어야합니다.

일반적인 기본 클래스는 일반적인 구현 세부 사항이 많을 때 유용 할 수 있으며 순수하게 인터페이스로 복제하는 것은 의미가 없습니다.

public interface IFoo { 
    void Bar(); 
} 
public static class FooExtensions { 
    // just a silly example... 
    public static bool TryBar(this IFoo foo) { 
     try { 
      foo.Bar(); 
      return true; 
     } catch { 
      return false; 
     } 
    } 
} 
+1

과부하를 생성하는 방법으로 extenson 메서드를 사용하는 것이 좋습니다. 그렇게하면 인터페이스가 구현하기 쉽고 오버로드가 모든 구현에서 동일한 방식으로 처리됩니다. –

+0

나는 설명의 의미로 이것을 정말로 좋아한다. 마크, 아래의 너와 얀은 답을 설명하는데 많은 노력을 기울 였는데, 고맙다 - 분명히 그 밖의 것들을보기 위해 기다릴 것이지만, 고마워 - 정말 도움이된다! –

+0

@Jacob - 실제로; C# 4.0을 사용하기 전까지는 선택적 매개 변수를 사용하는 것이 좋습니다. 예를 들어 필자는 인터페이스에 "페이징 된"버전의 쿼리 메서드를 사용하는 경향이 있으며 기본 메서드 인 "모든 것을 얻으십시오"(더 간단한) 오버로드를 제공하기 위해 확장 메서드를 사용합니다. 그럼 난 콘크리트 사이트, 2/3/4/등 –

2

위의 세 가지가 자신의 권리를 유효하고 유용합니다. "최상의"기술이 없습니다. 프로그래밍 실습과 경험만으로도 적시에 올바른 기술을 선택할 수 있습니다.

이제는 적절한 방법을 선택하고 구현하십시오. 효과가있는 부분, 실패한 부분, 수업을 배우는 부분을보고 다시 시도하십시오.

2

인터페이스는 일반적으로 다음과 같습니다 -하지만 흥미롭게도 구현이 결코 구현에 따라 달라질 경우, 확장 메서드 (각 구현하지 않도록 그것을 할)를 interface에 노출하는 유용한 방법을 제공합니다 여러 가지 이유로, 선호 :

  • Polymorphisme이 계약에 관한, 상속
  • 상속 체인은 디자인 버그 예를 들어보고, 특히 단일 상속 (제대로하기 어려운 재사용에 관한 것입니다 당신이 일반적인 functionnality, 당신을위한 인터페이스를 사용할 수 있습니다를 활용하려는 경우 말했다 Windows에서 등, 스크롤, 서식있는 텍스트, 같은 기능이 상속 체인에 하드 코드 Forms 컨트롤을
  • 상속이 원인이 유지 보수 문제

polymorphism (당신의 메소드가 인터페이스를 받아들이도록하십시오). 그러나 추상적 인 기본 클래스를 사용하여 어떤 행동을 공유하십시오.

public interface IFoo 
{ 
    void Bar(); 
    enter code here 
} 

이 기본 구현

public class SomeFoo : BaseFoo 
{ 

} 

될 것입니다 것은 당신이 당신의 구현을 재사용하는 클래스입니다

public abstract class BaseFoo : IFoo 
{ 
    void Bar 
    { 
     // Default implementation 
    } 
} 

사용자 인터페이스 될 것입니다. 우리는 방법의 인터페이스를 사용하고

public class Bar 
{ 
    int DoSometingWithFoo(IFoo foo) 
{ 

    foo.Bar(); 
} 
} 

주의 :

하지만 당신은 다형성을 가지고 인터페이스를 사용됩니다.

+0

정말이 게시물의 상단에 귀하의 요약 너무 얀 - 나는 그것이 높은 수준에서 마음을 집중하는 데 도움이 생각합니다. –

1

먼저 다형성은 그 자체로 끝나지 않고 끝나기 때문에 "왜 다형성을 사용해야합니까?"라는 질문을해야합니다. 문제를 잘 정의한 후에는 어떤 접근 방식을 사용해야하는지 명확해야합니다.

어쨌든, 주석이 세 aproaches는 배타적이지 당신은 단지 몇 가지 클래스가 아닌 다른 사람 사이에 로직을 재사용, 또는 별개의 인터페이스를 필요로 할 경우, 당신은 여전히 ​​...

+0

절대적으로 - 위의 내용은 다형성을 사용하여 더 많은 접근법을 이해하고, 각각을 사용할 때 (또는 여러분이 말했듯이 혼합하고 일치시켜야 함) 많은 것을 고려한 것입니다. –

1
  • 사용 초록을 혼합 할 수 있습니다 수업은 정말 당신이 당신의 코드와 당신이 그것으로하고 싶은를 구성하는 방법에 따라 설명하는 행동
0

의 클래스 구조를

  • 용도의 인터페이스를 적용합니다.

    인터페이스 유형이 기본 클래스 인 것은 모의 객체를 사용하여이를 대체 할 수 있으므로 테스트 측면에서 좋습니다.

    추상 클래스는 실제로 추상 클래스가 추상 함수 이외의 다른 것을 가지고있는 것처럼 일부 함수에서 코드를 구현하려는 경우 실제로는 인터페이스입니다.

    추상 클래스는 인스턴스화 할 수 없으므로 작업 코드의 경우 파생 클래스가 있어야합니다.

    실제로 모든 것이 유효합니다.

    나는 파생 클래스를 많이 가지고 있지만 얕은 레벨 (말하자면 1 클래스 만)의 추상 클래스를 사용하는 경향이 있습니다.

    깊은 상속 수준이 예상되는 경우 가상 함수가있는 클래스를 사용합니다.

    어쨌든 클래스를 단순하게 유지하는 것이 가장 바람직합니다. 더 복잡한 클래스는 상속성과 함께 버그를 도입 할 확률이 높아집니다.

  • +0

    : "실제 코드에는 파생 된 클래스가 있어야합니다."- 실제로 ** 구체적인 구현을하지 않고 ** 인터페이스와 추상 클래스를 모두 유용하게 * 사용할 수있는 방법이 있습니다 ... 대단히 중요한 경우 , 그러나 할 수있는 - Expression을 사용하여 * intent * (RPC 등에서 유용함)를 사용하여, 실제로 메소드를 호출 할 필요가 없습니다. –

    관련 문제