2010-05-14 4 views
1

다음 추상 클래스 디자인을 사용하고 있습니다. 우리 요구 사항을보다 강력하게 적용하거나 ControllerBase 구현을 단순화하는 측면에서 개선을 제안 할 수 있는지 궁금합니다.이 일반 추상 클래스를 향상 시키십시오.

//Dependency Provider base 
public abstract class ControllerBase<TContract, TType> where TType : TContract, class 
{ 
    public static TContract Instance 
    { 
     get { 
    return ComponentFactory.GetComponent<TContract, TType>(); 
      } 
    } 

public TContract GetComponent<TContract, TType>() where TType : TContract, class 
{ 
     component = (TType)Activator.CreateInstance(typeof(TType), true); 
     RegisterComponentInstance<TContract>(component); 
} 
} 

//Contract 
public interface IController 
{ 
void DoThing(); 
} 

//Actual Class Logic 
public class Controller: ControllerBase<IController,Controller> 
{ 
public void DoThing(); 

    //internal constructor 
    internal Controller(){} 

} 


//Usage 
public static void Main() 
{ 
Controller.Instance.DoThing(); 
} 

다음 사실은 항상 진실해야

  • TType 항상 TContract

  • TContract가 인터페이스해야합니다 (일반적인 제약 조건을 사용하여 강제)를 구현해야합니다 (찾을 수없는 집행 방법)

  • TType public constructor를 가지지 않아야합니다. 내부적 인 것만 있으면, ControllerBase을 사용하는 것을 강제 할 방법이 있습니까?

  • TType 구체적인 클래스를해야합니다

+1

TContract를 적용하는 것은 말도 안되는 것처럼 보입니다. 나를 틀리게하지 말라. 그러나 인터페이스는 인스턴스화 될 수 없다. 그들을 단순한 계약으로 이해하고, 더 이상 아무것도, 그들은 행동을 (주로) 시행합니다. 그러나 그들은 형식도 수업도 아닙니다. 왜 그것이 인터페이스가되는지 설명해야합니다. –

+0

미안하지만 왜 내가 인터페이스를 말했는지 모르겠다. 나는 추상적 인 클래스를 의미했다. –

+0

왜 작동하지 않는지 상세히 설명하겠습니까? –

답변

0

이 TType는 구체적인 클래스 인 강제 할 수있는 방법이있다 (생성자가 내부로 표시해야하기 때문에 일반적인 구속와 같은 새로운()를 포함하지 않았다) 동시에 생성자의 성공을 금지합니다. TType을 인스턴스화하려고 시도하는 것이 가능할 수도 있지만 구체적인 유형 인 경우에만 성공하지만 인스턴스화를 피하기를 원합니다. 나는 생성자로부터 예외를 던질 것을 제안 할 것이다. 컨트롤러 기반에서 예외 처리 코드로 인스턴스화를 둘러 쌀 수 있습니다. 이것은 구체적인 유형을 인스턴스화하고 예외를 throw하는 경우 런타임을 통해 얻을 것입니다 컴파일 시간을 통해 얻을 것이다 ... 이것은 전반적인 나쁜 관행 (가능하면) 그리고 당신은 당신이 찾고있는 무엇인가를 완전히 완전히 다른 디자인이 필요하다고 생각합니다 .

관련 문제