2012-03-26 6 views
1

생성자를 사용하여 파생 클래스에서 보호 된 멤버를 초기화하려고하지만 base()를 호출하기 때문에 this()를 호출 할 수 없어 일부 호출이 "냄새 "기본 생성자를 호출 할 때 초기화 메서드 재사용

public class ABase 
    { 
     public object Param1 { get; set; } 
     public object Param2 { get; set; } 
     protected object Param3 { get; set; } 

     public ABase() 
      : this(null, null) 
     { } 

     public ABase(object param1) 
      : this(param1, null) 
     { } 

     public ABase(object param1, object param2) 
     { 
      Param1 = param1; 
      Param2 = param2; 
     } 
    } 

    public class A : ABase 
    { 
     public A() 
     { InitParam3(); } 

     public A(object param1) 
      : base(param1) 
     { InitParam3(); } 

     public A(object param1, object param2) 
      : base(param1, param2) 
     { InitParam3(); } 

     private void InitParam3() 
     { 
      Param3 = "param3"; 
     } 
    } 

모든 생성자에서 InitParam3()를 호출 피할 수있는 방법이 있나요. 나는 변화를 디자인하기 위해 열었습니다.

+0

현재 솔루션 (귀하의 코드)이 @lazyberezovsky 대답보다 좋습니다. 내 의견보기. – Aliostad

+0

'모든 생성자에서 InitParam3() 호출을 피할 수있는 방법이 있습니까? –

+0

사실 저는 두 분과 모두 동의해야하지만 각각의 해결책에는 자체 단점이 있습니다. – misha

답변

6

하위 클래스의 생성자 체인을 사용하고 기본 클래스의 대부분의 전체 생성자를 호출합니다.

public class ABase 
     { 
      public object Param1 { get; set; } 
      public object Param2 { get; set; } 
      protected object Param3 { get; set; } 

      public ABase() 
       : this(null, null) 
      { } 

      public ABase(object param1) 
       : this(param1, null) 
      { } 

      public ABase(object param1, object param2) 
      { 
       Param1 = param1; 
       Param2 = param2; 
      } 
     } 

     public class A : ABase 
     { 
      public A() : this(null, null) 
      { } 

      public A(object param1) 
       : this(param1m, null) 
      { } 

      public A(object param1, object param2) 
       : base(param1, param2) 
      { InitParam3(); } 

      private void InitParam3() 
      { 
       Param3 = "param3"; 
      } 
     } 

업데이트 (중복 제거 기본값)

public abstract class ABase 
{ 
    protected const object DefaultParam1 = null; 
    protected const object DefaultParam2 = null; 

    public object Param1 {get;set;} 
    public object Param2 { get; set; } 
    protected object Param3 { get; set; } 

    public ABase(object param1 = DefaultParam1, object param2 = DefaultParam2) 
    { 
     Param1 = param1; 
     Param2 = param2; 
    } 
} 

public class A : ABase 
{ 
    public A(object param1 = DefaultParam1, object param2 = DefaultParam2) 
     : base(param1, param2) 
    { 
     Param3 = "param3"; 
    }  
} 
+1

이 접근법의 문제점은 파생 된 클래스가 수퍼 클래스에 대해 그대로 두는 것과 동일한 가정을 수퍼 클래스가 만들고 있다는 것입니다. 수퍼 클래스는 'null'을 사용하여 초기화하고 'null'이외의 다른 기본값을 사용하기로 결정한 경우 2 곳을 변경해야합니다. – Aliostad

+0

ㅎ, 팁 주셔서 감사합니다. – misha

+0

예. 보호 된 매개 변수 초기화의 중복을 제거하는 유일한 방법입니다. –

1

이것은 OK 용액이다.

lazyberezovsky의 접근 방식의 문제점은 파생 클래스가 매개 변수의 기본값에 대해 고유 한 가정을 만들고있는 동안 수퍼 클래스 용으로 남겨야한다는 것입니다.

수퍼 클래스는 초기화에 null을 사용하고 null 이외의 다른 기본값을 사용하기로 결정한 경우 2 자리를 변경해야합니다.

나를 위해, 기본값에 대한 결정은 사소한 복제보다 더 중요합니다.

관련 문제