2013-09-02 4 views
0

다음과 같은 경우가 발생하는 시스템을 설계하고 있습니다. 구현마다 동작이 다른 f1() 메서드가 있습니다. 모든 구현에 대해 동작이 동일한 f2() 메서드가 있습니다.디자인 리팩토링

interface I1 
{ 
     //Behaviour will vary across implementations 
     void f1(); 
     //Same behaviour for all implementations 
     void f2(); 

} 

    abstract class C 
    { 
     //Implemented in the Base class 
     void f2() 
     { 


     } 
    } 

    public class C1:C,I1 
    { 
     //Implemented interface method 
     public f1() 
     { 

     } 

    } 
    public class C2:C,I1 
    { 
     //Implemented interface method 
     public f1() 
     { 

     } 

    } 

는 설계가 올 수 있습니다 :

나는 다음과 같은 설계했다? 아무도이 sceanario에서 적절한 디자인을 제안 할 수 있습니까? 다음과 같이

+0

그냥 부풀어 오른 모양입니다. 물론 우리는 컨텍스트 없이는 말할 수 없지만, 주석의 설명에 대해서는 ... – sehe

+0

http://blogs.msdn.com/b/mhop/archive/2006/12/12/implicit-and- explicit-interface-implementations.aspx이 링크를 확인하십시오. 나는 그것이 당신을 도울 것이라고 생각합니다. –

+0

클래스가 'C'에서 상속하여'f2()'를 가져와야하는 경우 인터페이스가있는 이유는 무엇입니까? 또한 인터페이스에서 선언하는 것과는 반대로,'f2()'를 확장 메소드로 구현하는 것을 고려 했습니까? –

답변

3

당신은 방법의 F1()와 F2()와 하나의 추상 클래스를 만들어야합니다

abstract class A 
{ 
    public abstract f1(); 
    protected void f2() 
    { 
    } 
} 

class B : A 
{ 
    public override void f1() 
    { 
    } 
} 

을 당신이시를 기반으로 클래스를 만들 때마다 지금, 그들은 방법 F1에 대한 자신의 행동을 지정할 수 있습니다 ().

0

대안은 전략 패턴을 사용하는 것입니다

public interface IF1Strategy 
{ 
    void f1(); 
} 

public sealed class C : I1 
{ 
    private readonly IF1Strategy _f1Strategy; 

    //strategy injected 
    public C(IF1Strategy strategy) 
    { 
     _f1Strategy = strategy; 
    } 

    void f2() 
    { 
    } 

    void f1() 
    { 
     //delegated to strategy 
     _f1Strategy.f1(); 
    } 
} 

NB : 당신의 f1 전략 구현이 f2를 호출 할 필요가없는 경우에만 적합합니다.

장점 :

  • 당신은 적절한 전략을 주입 할 수 있습니다.
  • 당신 스스로 단위 테스트 전략을 세울 수 있습니다.
  • 클래스 C은 다른 클래스의 독립성을 바꿀 수 있습니다. 즉, 클래스를 영원히 유지하는 데 도움이됩니다. 나는 그것이 sealed 인 것을 유의해라. 한마디로

, 나는 당신의 문제에 대한 좋은 해결책을 제공하기 위해 전략 패턴과 함께 내가 설계 원칙 죄송합니다 다음입니다 Composition over inheritance

0

을 선택하고있다. 이것들은 제가 따르는 원칙입니다 : 1. 상속에 대한 컴포지션을 선호하십시오. 도움이

F1 own implementation 1 
f2 same behavior 
F1 own implementation 2 
f2 same behavior 

희망 : 2. 프로그램

public interface I1VariedBehavior 
{ 
    void f1(); // Varies for the implementation. 
} 
public abstract class I1SameBehavior 
{ 

    public void f2() 
    { 
     Console.WriteLine("f2 same behavior"); 
    } 
} 
public class F1Impl1 : I1VariedBehavior 
{ 
    public void f1() // f1 is own implementation 
    { 
     Console.WriteLine("F1 own implementation 1"); 
    } 
} 
public class F1Impl2 : I1VariedBehavior 
{ 
    public void f1() // f1 is own implementation 
    { 
     Console.WriteLine("F1 own implementation 2"); 
    } 
} 
public class C1 : I1SameBehavior 
{ 
    I1VariedBehavior strategy; 
    public C1(I1VariedBehavior strategy) 
    { 
     this.strategy = strategy; 
    } 
    public void f1() 
    { 
     strategy.f1(); 
    }   
} 

public class Client 
{ 
    public static void Main(String[] args) 
    { 
     C1 c1 = new C1(new F1Impl1()); 
     c1.f1(); 
     c1.f2(); 

     C1 c2 = new C1(new F1Impl2()); 
     c2.f1(); 
     c2.f2(); 
     Console.Read(); 
    } 
} 

출력을 구현하지 인터페이스입니다.