2011-01-12 2 views
3

사용할 수있는 일반적인 래퍼 클래스가 하시겠습니까 :사용할 내가 자신을 쓸 수 없습니다 다음 클래스를,하고 싶은 상속 목적

class Wrapper<G> : G 
{ 
    public Wrapper(G base); 
    protected G GetBase(); 
} 

그것은 asual로 G의 모든 구성원을 상속하는 것, 그리고 이 구성원들의 모든 용도는 건설 중에 제공된 G로 재 지정됩니다.

기술적으로 C#과 같은 언어에이 기능을 추가 할 수 있습니까? 내가 이것을 사용하고 싶습니다

주요 유스 케이스는 다음과 같습니다

class Wrapper<G> : G 
    { 
     public Wrapper(G g); 
    } 

    class IGraphNode<G> where G : IGraphNode<G> 
    { 
     IEnumerable<G> ForwardNodes(); 
     IEnumerable<G> BackwardNodes(); 
    } 

    //Reverses the direction of the graph. 
    class Reverse<G> : Wrapper<G> where G : IGraphNode<G> 
    { 
     public Reverse(G g) 
      : base(g) 
     { } 

     IEnumerable<G> ForwardNodes() 
     { 
      return base.BackwardNodes(); 
     } 

     IEnumerable<G> BackwardNodes() 
     { 
      return base.ForwardNodes(); 
     } 
    } 
+2

왜 필요한가요? – mdm

+2

G가 무엇이고 Wrapper가해야 할 일에 대한 구체적인 예가 있습니까? – epitka

+2

정규 상속에 어떤 문제가 있습니까? 이미 구현 된 종류입니까? –

답변

0

나는 그것이라는 것을 잊지이 루비에 존재라고 생각한다. 이것은 C#에서 지원되지 않습니다. C#에서이 기능을 추가 할 수 있습니까? 물론, .Net 및 C# 팀에게이를 구현하도록 설득 할 수 있다면 ... 그렇지만 나는 그럴 것이라고 생각합니다.

+1

C++에서는 CRTP (Curiously Recurring Template Pattern)라고 불립니다. 루비에서는 기술적으로는 다른 것이지만 "믹스 인"이라고도 할 수 있지만 CRTP는 때때로 C++에서 * 믹스 인을 구현하는 데 사용됩니다. –

+0

@Konrad : 흥미 롭습니다. 루비의 위임자 패턴이라고 생각합니다. –

0

확장 프로그램을 사용하지 않는 이유는 무엇입니까? 이제 다음을 사용할 수 있습니다 someother 클래스에서

public static class MyStringExtensions 
{ 
    public static string Add1ToString(this string myString) 
    { 
     myString += "1"; 
     return myString; 
    } 
} 

는 :

using YourNamespaceOfTheExtensionMethods; 

public class OtherClass 
{ 
    public string DoSomething() 
    { 
     string someString = "Hello"; 
     return someString.Add1ToString(); 
    } 
} 

나는 예로서 string을 사용하지만, 당신이 원한다면 당신은 Object을 확장 할 수 있습니다.

+0

그는 GenericExtensions 에있는 MyClassA의 메서드에 대한 모든 호출이 MyClassA 인스턴스의 메서드를 호출하기를 원한다고 생각합니다. 그게 의미가 있다면 ... :) –

+0

정확히 내가 대답을 게시 한 후 그것을 발견했습니다 :) –

+0

그는 단지 확장 기능을 사용하고있을 수 있다고 생각하기 때문에 첫 번째 대답을 삭제했습니다. –

1

원하는지 확신 할 수 없지만 DynamicProxy을 사용하여 필요에 따라 런타임 및 인터셉트 방법 및 속성 호출시 래퍼 객체를 만들 수 있습니다.

0

리플렉션을 통해이 작업을 수행 할 수 있습니다. 그러나 당신의 목표는 정확히 무엇입니까? 클래스를 꾸미거나 그 클래스를 사용하는 도구를 만들려면 어떻게해야합니까? 기존 인스턴스을 위험에 처하는 방식으로 확장하십시오. 기본 클래스의 새 인스턴스를 만들지 않으므로 객체를 사용하는 코드는이를 인식하지 못합니다. 즉, 속성은 새 개체 또는 확장되는 다른 개체를 변경할 수 있으며 정확한 기능은 구문에서 알 수 없습니다.

나는 그것을 (투명하게) 훨씬 더 투명하게 (일반적으로) 생각할 것이다.

class Wrapper<G> where G: SomeType 
{ 
    public G Base; 
    public Wrapper(G g) { 
     Base = g; 
    } 

    // methods to do stuff with object supplied at construction 
} 

당신은 where없이이 작업을 수행 할 수 있습니다하지만 난 당신이 기본 유형이 무엇인지 상관하지 왜 많은 이유 생각할 수 없다.

실제로 새 속성이있는 새 클래스를 만들고 기존 클래스의 데이터를 상속받는 경우 실제로는 이해할 수 없기 때문에 너무 열심히 노력한 것 같습니다. 두 개체는 더 이상 합리적인 방법으로 묶여 있지 않습니다. 즉, 기본 클래스의 속성을 변경하면 확장 속성의 변경 내용과 다른 개체가 영향을받습니다. 이 예제에서 MyWrapper.Base에 속성이 있다면 정확히 어떤 일이 일어날 지 모르지만 실제로 이것이 목표라면 별도로 기본 객체 참조를 유지하는 것이 더 개념적으로 바람직합니다. 그렇지 않으면 확장 객체를 사용하는 클라이언트가이를 이해하지 못해 코드가 올바르게 작동하지 않는 이유를 쉽게 알지 못하게 될 수 있습니다.

class Wrapper<G>: G 
{ 
    public Wrapper(G g) { 
     // add memberwise copy function 
    } 
    .. more properties 
} 

Wrapper<SomeType> newWrapper = Wrapper<SomeType>(someOtherObject); 

.. 당신은을 만드는 방법 같은 : 당신이 뭔가를 확장, 일부 투명한 방법으로 기존 개체의 복사 특성 새로운 객체를 만들려면

는 다음과 같은 일을 할 기존 목록의 새 목록

+0

그가 원하는 것은 확장 방법이라고 생각합니다. 내 생각 엔 그는 기존 클래스에 기능을 "추가"하고 확장 메서드를 사용하기를 원한다는 것입니다. –

+0

당신이 옳을 수도 있다고 생각하십시오. 하지만, 자신의 객체로 작업하는 경우 핵심 설계에 이러한 메소드를 포함 시키거나 기본 클래스와 상속을 사용하여 객체의 목적이 다른 버전을 작성하는 것이 좋을 이유가 있습니다. 하지만 네, 만약 그의 목표가 다른 누군가의 물건을 장식하는 것이라면 그것은 길 일 것입니다. 어떻게 든 내 직감은 단지 방법이 아닌 속성을 추가하기를 원한다고 말합니다. –

관련 문제