2014-09-18 1 views
1

필자가 쓰는 프로그램에 좋은 디자인 패턴을 구현하려고합니다. 나는 이런 구조를 가지고있다.클래스 base() 생성자 및 이것을 전달하십시오.

abstract class SomeBase 
{ 
    public SomeObject obj { get; protected set; } 

    protected SomeBase(SomeObject x) 
    { 
      obj = x; 
    } 

    //Other methods and fields... 
} 

public class SomeDerived : SomeBase 
{ 

    public SomeDerived() : base(new SomeObject(this)) 
    { 

    } 

} 

이제 저는 확실합니다. 객체가 초기화되지 않았으므로 이것을 생성자에서 전달할 수 없습니다. 하지만 실제로 해결 방법이 있기를 바랬습니다. SomeDerived()가 기본 클래스 필드의 설정을 처리하도록 허용하는 것이 가장 좋은 방법은 아닙니다. 나는이 새로운 사물을 사슬에 넘겨주고 싶다.

아이디어가 있으십니까?

+3

다른 하위 클래스가 * '*'를 참조하지 않는'SomeObject' 인스턴스를 만들고 싶습니까? 그렇지 않다면, 그 논리를'SomeBase' 생성자의 몸체에 넣으십시오 :'obj = new SomeObject (this);' –

+0

왜 이것을 원합니까? 나는 필요성을 보지 못한다. –

+0

글쎄, 내가하고있는 일이 유용하다고 생각한다. 그래서 저는 게임 내에서 StateMachine을 사용합니다. 다양한 State (Action, Size, Vulnerability) 상태를 유지하는 StateManager 클래스가 있습니다. 국가는 다른 주를 새롭게하고 스스로를 대체 할 수있는 능력이 필요합니다 (교수님의 요구 사항). – guitar80

답변

-2

1) 생성자는 전혀 설계가 잘못되었습니다. 인스턴스 메소드와 비슷하지만 실제로는 절반 인스턴스의 절반 메소드입니다.

2) 우리가 여기서 볼 수있는 것처럼 "패턴이있는 좋은 디자인 프로그램"은 집계에서 클래스 간의 즉각적인 순환 종속성을 발생시키지 않습니다. 두 클래스 모두 SomeObject가 " 이 "그것의 생성자에서 ???

"패턴"에는 두 가지 문제가 있습니다. 즉, 클래스 간의 높은 종속성과 초기화 논리의 사용 불가능한 캡슐화가 있습니다. 그래서 우리는 그것을 해결하기 위해 "패턴"방법을 찾아야 만합니다 ... 흠 .. 무엇을해야합니까 ...

코드에서 u는 내가 파생 클래스가 속성 obj에 대한 자신의 논리를 제공한다는 것을 보여줍니다 u는 그것을 다시 작성할 수 있습니다. 추가 보너스 "다형성")) 및 얻을 - - 자동 초기화 때에 프로퍼티

public abstract class MyClass{ 
    private SomeObject _obj ; 
    public SomeObject Obj {get { return _obj ?? (_obj = InitializeObj());}} //no setter needed 
    protected abstract SomeObject InitializeObj(); 
} 

public class MyRealClass:MyClass { 
    protected override SomeObject InitializeObj(){ 
     return new VerySpecialSomeObject(this, other, another, 1, 2 , false, option: new Options()); 
    } 
} 

같은 솔루션은 승리 하나의 "패턴"를 제공하여 예를 들어이 될 "obj가"유용하지 않을 경우 -이 생성되지 않음))))

+0

어쩌면 오해입니다. 그러나 이것이 내 문제에 도움이된다고 생각하지 않습니다. 내 원래 게시물 아래에있는 의견을 읽으면 문제를 자세히 설명합니다. 미안하지만이게 내 혼란이라도. – guitar80

+0

아니, 너의 문제를 오해 한 것 같아. U는 패턴 화 된 것을 만들려고 시도하지만 어떤 패턴으로 놓여있는 기본적인 문제 (객체 간의 최소 표면적, 의존성의 최소화, 클래스의 팩터링, 모듈화)를 이해하지 못합니다. 따라서 코드를 유용하지 않고 편안하게 만들 수 있습니다! 작성자 - 귀하의 문제입니다 !!! 당신은 CONSTRUCTORS - IT 'S PATTERN과 함께 사소한 건설 논리를 표현하려고 노력합니다. 만약 U가 사소한 구조를 가지고 있지 않다면, 무시 무시한 생성자를 사용하여 braincrashing하는 대신 Factory 패밀리의 패턴을 사용해야합니다. –

4

생성자 다음에 Init 메서드를 사용하십시오.

abstract class SomeBase 
{ 
     private SomeObject _obj { get; set; } 
     public SomeObject obj 
     { 
      get 
      { // check _obj is inited: 
       if (_obj == null) throw new <exception of your choice> ; 
       return _obj; 
      } 
     } 

     protected SomeBase() 
     { 
      obj = null; 
     } 

     protected void Init() 
     { 
      obj = x; 
     } 

     //Other methods and fields... 
} 

public class SomeDerived : SomeBase 
{ 

     public SomeDerived() : base() 
     { 
      Init(new SomeObject(this)); 
     } 

} 
+0

감사합니다.그것은 기본적으로 내가 한 일입니다. 나는 마술을 바라고 있었다고 생각합니다. 하하는 간결한 대답 – guitar80

+0

을 주셔서 감사합니다. 아니면 추상 속성을 만들 수 있습니다. 적은 코드. 어떤 단점이 있는지 확실하지 않습니다. –