2010-03-19 5 views
1

나는 C#에서 이러한 클래스가 (.NET 프레임 워크 3.5) 아래에서 설명하는 방법 :"포장"C#에서 구현

public Base GetStateDependentImplementation() 
{ 
    if (State == Running) // may be some other rule 
    return _b; 
    else 
    return base; // compile error 
} 

:

public class Base 
{ 
    public int State {get; set;} 

    public virtual int Method1(){} 
    public virtual string Method2(){} 
    ... 
    public virtual void Method10(){} 
} 


public class B: Base 
{ 
    // some implementation 
} 

public class Proxy: Base 
{ 
    private B _b; 
    public Proxy(B b) { _b = b; } 

    public override int Method1() 
    { 
     if (State == Running) 
     return _b.Method1(); 
     else 
     return base.Method1(); 

    } 


    public override string Method2() 
    { 
     if (State == Running) 
     return _b.Method2(); 
     else 
     return base.Method2(); 

    } 


    public override void Method10() 
    { 
     if (State == Running) 
     _b.Method10(); 
     else 
     base.Method10(); 
    } 
} 

내가이 뭔가를 얻으려면 내 프록시의 구현은 :

public class Proxy: Base 
{ 
    ... 
    public override int Method1() 
    { 
     return GetStateDependentImplementation().Method1(); 
    } 


    public override string Method2() 
    { 
     return GetStateDependentImplementation().Method2(); 
    } 
    ... 
} 
public RepeaterOfBase: Base // no any overrides, just inheritance 
    { } 

public class Proxy: Base 
{ 
    private B _b; 
    private RepeaterOfBase _Base; 

    public Proxy(B b, RepeaterOfBase aBase) 
    { 
     _b = b; 
     _base = aBase; 
    } 
} 

... 
    public Base GetStateDependentImplementation() 
    { 
     if (State == Running) 
     return _b; 
     else 
     return _Base; 
    } 
... 

을하지만 기본 클래스의 인스턴스는 매우 거대하고 나는 메모리에 다른 추가 복사본을 가지고하지 않도록해야합니다 : 물론,이 (기본 구현의 집계를) 할 수 있습니다.

그래서 나는

  • 어떤 추가 인스턴스의 응집을 방지하기 위해 가지고 코드 중복을 피하기 위해
  • 구현을
  • 을 "포장"할 필요가 내 코드를 단순화 할 필요가있다 기본 클래스 (중복)

이러한 목표를 달성 할 수 있습니까?

답변

2

하나의 솔루션은 값 비싼 상태를 고유 한 클래스로 추출하고 구체적인 구현간에 인스턴스를 공유하는 것입니다.

+0

당신이 옳다, proxy.Implicit.Method1를();} } 을하고는 전화를해야한다 '.'.! 오늘 아침에 시작 했어요 – garik

+1

우수 (특히 오랫동안 문제를 오해 한 후) - 행운을 빌어 요! –

+0

정말 많은 변종을 시도해 봤습니다. 당신이 필요합니다. 완전히 동의해야한다. 감사. ;) – garik

0

당신은 암시 적으로이 같은 자료로 변환 프록시 객체를 가질 수 있습니다

public class BaseProxy 
{ 
    private Base _base; 
    private B _runningBase; 

    public BaseProxy(B b) 
    { 
     _base = new Base(); 
     _runningBase = b; 
    } 

    public static implicit operator Base(BaseProxy proxy) 
    { 
     return (State == Running) ? proxy._runningBase : proxy._base; 
    } 
} 

이 클라이언트 코드는 (그래서 절연 완전히 아니다) 기본이되는 객체에 대한 참조를 얻을 수 있지만, 허용 않습니다 프록시에 액세스하여 메소드가 예상대로 작동하도록해야합니다.


참고 : 이것은 실제로 내 생각처럼 암묵적인 사용을 허용하지 않습니다.

+0

하지만 프록시 속성을 추가 할 수있는 나는 ((자료) 프록시)를 작성해야 할 때마다 .Method1() .. :( 또는 수행해야합니다 공개 자료 암시 { GET {반환 ((자료)이) 네 말이 맞아 – garik

+1

, 나는 그것이 암시 수있는 것이라고 생각하지만 그렇지 않습니다 –