2012-03-29 3 views
1

몇 가지 조치를 취해야합니다. 각각에는 공통된 요소가 있으므로 한 클래스에서 상속해야합니다. 그들이 어떤 웹 작업을 할 수 있다고 말할 수 있습니다, 그래서 기본 클래스는이 작업의 각 나는 또한 Execute() 방법의 일종을 가지고 있어야 기본 클래스, 그래서 실행해야, 또한상속 된 클래스의 차이점을 처리하는 방법은 무엇입니까?

public class WebAction 
{ 
    private ServerData _serverData; 
    public WebAction(ServerData serverData) 
    { 
     _serverData = serverData; 
    } 
} 

입니다. 문제는,이 객체 각각이 조금 다른 일을한다는 것입니다. 그래서 그것은 다른 매개 변수를 가져야합니다. 내 질문은 - 마녀 방식이 이것에 도달하는 데 가장 좋은가요?

처음에는 몇 가지 구성 개체 (예 : e, g)를 생각하고있었습니다. Execute(IWebActionConfig config). 이 경우 다음과 같은 객체를 사용할 수 있습니다 :

LoginWebAction loginWebAction = LoginWebAction(staticServerConfig); 
LoginWebActionConfig = new LoginWebActionConfig { someData = "foo" }; 
loginWebAction.Execute(loginWebActionConfig); 

하지만 객체 트리를 추가로 만들 수 있습니까? 속성별로 WebAction의 각 하위를 구성하는 것이 더 좋을까요?

LoginWebAction loginWebAction = LoginWebAction(staticServerConfig); 
loginWebAction.someData = "foo"; 
// Execute will throw exception when someData not set 
loginWebAction.Execute(); 

이러한 경우 (있는 경우) 방법이 더 좋습니까?

답변

0

더 많은 OOP 스타일로 할 수 있습니다. look at NVI pattern

public class WebAction 
{ 
    private ServerData _serverData; 
    public WebAction(ServerData serverData) 
    { 
    _serverData = serverData; 
    } 
    public virtual ExecuteAction{}; 
    public Execute() 
    { 
    ExecuteAction(); 
    //to do the rest of base code 

    } 
} 
public class WebActionDerived1: WebAction 
{ 
    WebActionDerived1(ServerData serverData, object arg1/*any unique param*/) 
    :base(serverData) 
    { 
     _my_arg1 = arg1; 
    } 
    public override ExecuteAction 
    { 
    //call any procedure with your _my_arg1; 
    } 
} 
public class WebActionDerived2: WebAction 
{ 
    WebActionDerived1(ServerData serverData, string arg1, 
    string arg2/*otherunique param*/) 
    :base(serverData) 
    { 
     _my_arg1 = arg1; 
     _my_arg2 = arg2; 
    } 
    public override ExecuteAction 
    { 
    //call any procedure with your _my_arg1, and _my_arg2; 
    } 
} 
1

여기서 Command Pattern을 사용할 수 있습니다. "액션"을 캡슐화하는 서로 다른 명령 (각 웹 작업마다 하나의 명령)을 만들 수 있으며 각각의 명령에는 필요한 모든 매개 변수가 있습니다.

명령 처리기에는 해당 명령을 실행하기위한 "논리"가 포함됩니다. 에서 명령 패턴에 대한

대한 추가 정보 : 각 작업은 서로 다른 매개 변수를 사용으로

http://www.codeguru.com/csharp/.net/net_general/patterns/article.php/c15663/Implement-a-Command-Pattern-Using-C.htm

http://danielshitrit.blogspot.co.uk/2011/11/best-practices-command-pattern-in-c.html

1

당신은 정말 그들을 호출 할 수 다형성을 사용할 수있게 될 수 없습니다. 즉, 클래스에서 Execute를 호출하는 메소드는 Execute on을 호출 할 클래스의 정확한 유형을 알아야합니다.

그래서 상속을 사용하는 것이 실제로 올바른 해결책인지 궁금 할 것입니다.

각 클래스에는 공유 코드가 있으므로 상속을 사용한다고 명시했습니다. 이것은 일반적으로 상속을 사용할 충분한 이유가 아닙니다. 나는 그것을 안티 패턴으로 보았습니다.

상속을 사용할 때의 문제는 기본 클래스를 파생 클래스에 밀접하게 연결한다는 것입니다. 이로 인해 장치 테스트 및 향후 유지 관리에 문제가 발생할 수 있습니다.

공유 기능이 포함 된 별도의 클래스를 만드는 것이 좋습니다. 그런 다음이 클래스를 구성원으로 포함하고 필요에 따라 호출하는 Action 클래스. 이렇게하면 테스트 목적으로이 기본 클래스를 조롱 할 수 있습니다. 그런 다음 이러한 각 클래스는 필수 매개 변수가있는 각각의 Execute 메서드를 가질 수 있습니다.

관련 문제