2014-11-05 3 views
0

잠시 동안이 작업을 수행하지 않았으며이 작업이 최선의 방법인지 알아야합니다. derived 클래스의 base 클래스에있는 보호 된 속성을 할당하는 (설정하는) 데 문제가 있습니다. 나는 해결책이 있지만 이것이 가장 좋은 것인지 알고 싶습니다. design pattern을 사용하거나 더 좋은 방법이 있습니까?파생 클래스에서 보호 속성 할당

내 기본 클래스

public abstract class EmailBase 
{ 
    protected string Subject { get; set; } 
    protected string To { get; set; } 
    protected string From { get; set; } 

    protected virtual void Send() 
    { 
     using (MailMessage mail = new MailMessage()) 
     { 
      // Ok send message here... 
     } 
    } 

}

나는 그러나 나는를 게시 할 예정입니다, 나는 그래서 그것을 두 개의 파생 클래스를 가지고 것은 좋은 생각 일 것이다라고 생각 보내야하는 두 개의 서로 다른 이메일 템플릿이 문제의 한 파생 클래스를위한 코드.

public class DerivedOne: EmailBase 
{ 
    private const string emailTemplate = "some static text for the body..."; 

    public DerivedOne() 
    { 
    } 

    // This is how I want to set the base class properties, 
    // but it feels I am just duplicating properties... 
    public string To 
    { 
     set 
     { 
      base.To = value; 
     } 
    } 

그리고 컨트롤러의

... 내가 속성을 설정하면 청소기 경향이있다 생각으로 파생 된 생성자에서 등록 정보를 전송하지 경향이
// A send email button was pressed by the user 

    private bool SendEmail(Model) 
    { 
     DerivedOne eMail = new DerivedOne() 
     { 
      To = Model.To; 
     }; 
    } 

. 그러나 파생 생성자에서 기본 속성을 설정할 수 있음을 알고 있습니다. : base()

그래서 내가 컨트롤러에서 볼 수 있도록 파생 클래스에서 동일한 속성을 만드는 것이 잘못 되었습니까? (보호 된 속성은 물론 상속 밖에서 볼 수 없으므로)

+1

기본 클래스의 속성이 공개되지 않은 이유는 무엇입니까? – galenus

+0

다형성 이론을 망치지 않습니까? (그것은 내가 생각하는) 던지기가 아니었다. 그래서 나는 틀렸다고 생각한다. – user3428422

+0

기본 유형의 참조를 통해 파생 된 유형에 액세스 할 수 있기 때문에 다형성을 적용합니다. – galenus

답변

0

예, 저는 의심 할 여지가 있다고 생각합니다. 가능한 한 중복을 피하고 OOP의 모든 권한을 사용하는 경향이 있습니다.

게다가 클래스를 변경하지 않고 생성자를 통해 종속성을 제공하면 많은 문제를 피할 수 있습니다. 클래스가 종속성을 유지해야하는 경우이 종속성은 생성자를 통해 제공되어야합니다. 이렇게하면이 종속성을 제공하지 않고도 클래스의 인스턴스를 만들 수 없다는 자신 (및 다른 프로그래머)을 보장 할 수 있습니다. 예를 들어 귀하의 경우에 ~ 정보를 보내지 않고 이메일을 보내실 수 없으므로 생성자를 통해 까지을 제공하는 것이 좋습니다. 다른 종속성에도 동일한 추론을 적용 할 수 있습니다.

게다가 파생 클래스에서 보호 된 속성을 할당하면 문제가 될 수 있으며 Liskov 대체, 열기 닫기 및 기타 SOLID 원칙을 위반할 수 있습니다. 그러나 물론, 때로는 유용 할 수 있으며, 이것을하지 않는 일반적인 규칙은 없습니다.

관련 문제