2013-04-21 1 views
2

기본 형식의 클래스 인스턴스를 반환 유형에 반환해야하는 메서드가 있습니다. 예를 들어 :기본 형식으로 선언 된 메서드에서 derivered 형식을 반환하는 방법

class A 
{ 
    public string X { get; set; } 

    public A SetX(string x) 
    { 
     this.X = x; 
     return this; 
    } 
} 

class B:A 
{ 
    public string Y { get; set; } 

    public B SetY(string y) 
    { 
     this.Y = y; 
     return this; 
    } 
} 

은 그 때 나는 유창하게 다음과 같이 메소드를 호출 할 : (A)의

B b = new B(); 

b.SetX("x") 
.SetY("y"); 

그러나 여기 SetX 반환 유형, A는 SetY라는 이름의 방법을 has'nt. 그런 기능을 어떻게 디자인 할 수 있습니까?

+4

http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – SLaks

답변

3

protected string X { get; set; } 
protected A SetX(string x) 
{ 
    this.X = x; 
    return this; 
} 
+0

첫 번째 옵션은 내가 이미 알고있는 것이며 두 번째 옵션은 내가 원하는 것입니다. 옵션을 재정렬해서 분명하게해야한다고 생각합니다. –

+0

@HalilIbrahim 귀하가 요청한 것처럼 명령을 변경했습니다. 도움이 되었다니 다행 – mlorbetske

0

사용은 보호 :

public static T SetX<T>(this T a, string x) where T : A 
{ 
    a.X = x; 
    return a; 
} 

당신은 다음과 같이 호출 할 수 있습니다 :이

var newB = b.SetX("foo"); // returns type B 
4

하나의 옵션은 일반적인 확장 방법으로 SetX를 선언하는 것 이것을 성취하기 위해 할 수있는 몇 가지 다른 것들이 있습니다. new 키워드를 사용 A에서 방법을, 당신의 B 클래스

public class A<T> where T:A<T> 
{ 
    public string X { get; private set; } 

    public T SetX(string x) 
    { 
     X = x; 
     return (T) this; 
    } 
} 

public class B<T> : A<T> 
    where T : B<T> 
{ 
    public string Y { get; private set; } 

    public T SetY(string y) 
    { 
     Y = y; 
     return (T) this; 
    } 
} 

public class A : A<A> 
{ 
} 

public class B : B<B> 
{ 
} 

두 번째는,이다 숨기기 :

첫 번째 인스턴스의 실제 유형을 지정하는 유형 매개 변수를 사용하여, 제네릭을 사용하는 것입니다 그래서 같은 :

class A 
{ 
    public string X { get; set; } 

    public A SetX(string x) 
    { 
     this.X = x; 
     return this; 
    } 
} 

class B : A 
{ 
    public string Y { get; set; } 

    public new B SetX(string x) 
    { 
     return (B) base.SetX(x); 
    } 

    public B SetY(string y) 
    { 
     this.Y = y; 
     return this; 
    } 
} 
+0

멋진 솔루션이지만 내 Stuation에 A와 B는 allready 제네릭 클래스이고 extendstion 메서드를 사용할 때는 제네릭 형식 매개 변수를 해결할 수 없습니다. –

0

이 사람은 나를 위해 일한 :

(b.SetX("1") as B).SetY("2"); 
관련 문제