2009-11-06 7 views
5
난 항상 때문에, 구현 클래스의 객체를 반환하는 방법을 정의하는 C#에서 인터페이스를 만들고 싶어

:구현 클래스가 자신의 유형의 객체를 반환하도록 할 수 있습니까?

public interface IParser { 
    IParser Parse(string s); 
} 

public class Parser : IParser { 
    public Parser Parse(string s) { 
     return new Parser(s); 
    } 
} 

내가 자신 형식의 개체를 반환하는 구현 클래스를 강제 할 수 있습니까? 가능하다면 어떻게? 아니면 제네릭 답이 ​​여기에 있습니까?

NB : 코드는 단순한 그림이 아니라 실행 해야하는 무언가이다.

+0

당신은 나를 매우 궁금했습니다 ... 당신은 그들이 의미하지 않는 무언가에 대한 인터페이스를 사용하려는 생각? 일반적으로 인터페이스를 정의하는 지점은 클라이언트 코드가 해당 API의 구체적인 유형을 알거나 신경 쓰지 않고 특정 API를 객체에 정의 할 수 있음을 신뢰할 수 있도록하기위한 것입니다. 그것은 OOP의 가장 큰 강점 중 하나입니다. 이 일을 통해 달성하고자하는 것은 무엇입니까? –

+0

글쎄, 내 생각에이 인터페이스를 사용하면 항상 인터페이스를 구현하는 클래스가이 메서드를 가지며 항상 자신의 형식을 반환한다는 것을 신뢰할 수 있다고 생각했습니다. 그러나 당신이 말했듯이, 이것이 최고의 오브젝트 디자인이 아닐 수도 있습니다. 대신 인터페이스 유형을 리턴하는 메소드를 위해이를 포기할 것입니다. – Cros

답변

8

제네릭이 답이다 이리.

public interface IParser<T> where T:IParser<T> { 
    T Parse(string s); 
} 

public class Parser : IParser<Parser> { 
    public Parser Parse(string s) { 
     return new Parser(s); 
    } 
} 
+0

좋은 결과 ... 나는 똑같은 일을하기 위해 코드를 테스트하고있었습니다. +1 – jheddings

+0

나는 즉시 그렇게 할 것입니다. – Cros

+0

인터페이스를 이와 같이 일반적으로 만들 때 사용하는 타입에 대한 지정자로 ISelection을 사용하는 모든 곳에서 T를 지정해야합니다. 지금은 목록을 만들 수는 없다. 그러나 지금은 List >이어야한다. 나 맞아? 그렇다면 이것은 내가 찾고있는 해결책이 아닙니다. 슬프게도. – Cros

1

예, 이것은 the factory pattern로, 해당 일반적으로이 예를 들어, 개인 생성자의 사용과 보완 및 정적 메서드를 반환 인스턴스를 만드는 알려져

public class Parser : IParser { 

    private Parser(string s) { 
     //Do something with s, probably store it in a field 
    } 

    public static IParser GetNewParser(string s) { 
     return new Parser(s); 
    } 
} 
+0

필자는이 열쇠가 "... 구현 클래스가 자신의 유형의 객체를 반환하도록 강요합니다."라고 생각합니다. –

+0

이 질문은 실제로 "예/아니오"질문이 아니 었습니다. 가능한 경우 C#에서이 작업이 어떻게 수행되는지 구체적으로 알고 싶습니다. – Cros

0

제네릭에서는이 작업을 수행 할 수 있지만 인터페이스의 인스턴스를 반환하는 것이 좋습니다. 클래스가 인터페이스를 구현하기 때문에 인스턴스를 반환하는 것이 좋습니다. 이는 해당 유형의 인스턴스와 인터페이스의 인스턴스가 될 것입니다.

public class Parser : I Parser 
{ 
    public IParser Parser(string s) 
    { 
     return Parser(s); 
    } 
} 
5

인터페이스 선언에 없습니다. 당신이 관리 할 수있는 최선 제네릭입니다 :

public interface IParser<T> 
    where T: IParser<T> 
{ 
    T Parse(string s); 
} 

public class Parser 
: IParser<Parser> 
{ 
    public Parser Parse(string s) 
    { 
     return new Parser(s); 
    } 
} 

이되지 구현은 자신의 형의 반환 않지만, 적어도 그것이 그렇게 할 수 있습니다. 이것이 IClonable 인터페이스가 특정 형식이 아닌 Clone 메서드에서 개체를 반환하는 이유입니다.

---- 편집 ----이 질문에 기억

뭔가 :의 당신이 구현에 대한 지식을 갖고 있지 않은 내 코드, IParser하고 코드를 반환 가정 해 봅시다 Parse 메소드를 호출합니다. 반환되는 객체는 무엇입니까? IParser 참조의 구체적인 유형을 알지 못합니다. 왜이 작업을 수행하려고 : 나는

+1

+1은이 기술을 언급하더라도 요청 된 구현을 강제하지 않습니다. 다른 IParser 구현을 쉽게 반환 할 수 있습니다. AFAIK는 언어 수준에서이 수표를 시행 할 방법이 없습니다. 이것은 당신이 그것에 도달 할 가장 가까운 것입니다. –

관련 문제