2016-09-12 5 views
0

나는 여러 클래스에 상속 된 C#에서 추상 클래스로 작업하고있다. 내 코드에서 필 요한 것들 중 하나는 "Unset"과 같은 정적 속성입니다.이 속성은 기본 속성이 설정되지 않은 값으로 정의 된 클래스의 정적 인스턴스입니다. 일반적인 예는 다음과 같습니다.추상 클래스의 정적 인스턴스를 어떻게 정의 할 수 있습니까?

public abstract class Person 
{ 
     public string Name {get; set;} 
     public string PhoneNumber {get; set;} 
     public static readonly Person Unset = new Person() { 
      Name = "Unset Name" 
      PhoneNumber = "Unset Phone" 
     } 
} 

Person은 추상 클래스이기 때문에 "Unset"속성을 만들 수 없습니다. "Person"에서 파생되는 모든 클래스의 속성을 정의하고 싶지 않습니다. 이 문제를 해결할 방법이 있습니까?

답변

2

추상 클래스의 인스턴스를 만들 수 없습니다.

할 수있는 일, 그러나, 새로운 아이 만드는 것입니다 :

public class UnsetPerson : Person 
{ 
    public UnsetPerson() : base() 
    { 
     this.Name = "Unset Name"; 
     this.PhoneNumber = "Unset Phone"; 
    } 
} 

를 한 다음 기본 클래스에 static 속성을 설정하십시오 documentation 보여줍니다

public abstract class Person 
{ 
    public string Name { get; set; } 
    public string PhoneNumber { get; set; } 
    public static readonly Person Unset = new UnsetPerson(); 
} 
+0

싱글 톤 인스턴스에 공개 설정자를 추가하는 것은 정말 잘못된 생각입니다. – Groo

+0

이것이 내 프로젝트의 필요를 충족시키는 지 확신 할 수는 없지만 내가 물어 본 질문에 대한 해결책은 분명합니다. 감사! – celsound

0

abstract 키워드가 표시되는지 수정중인 것은 누락되거나 불완전한 구현을가집니다. 따라서 직접 생성 할 수 없으며 상속을 통해서만 사용할 수 있습니다.

추상 클래스에 추상 멤버가 없으므로 (선택 사항) 대체로 덮어 쓸 수있는 기본 구현을 제공 할 수있는 virtual 클래스를 사용할 수 있습니다. 당신이 상속하는 클래스의 클래스 멤버 중 하나를 대체하려면/필요가없는 경우

public virtual class Person 
{ 
    public virtual string Name { get; set; } 
    public virtual string PhoneNumber { get; set; } 
    public static readonly Person Unset = new Person() { 
     Name = "Unset Name", 
     PhoneNumber = "Unset Phone" 
    }; 
} 

, 당신은 추상 또는 가상 클래스를 만들 필요가 없습니다. Any (sealed) 클래스는 상속 될 수 있습니다.

+0

예입니다 - 실제 클래스는 추상적이어야합니다. 하지만 팁 주셔서 감사합니다. – celsound

0

귀하의 요구 사항을 완전히 이해하지 못했습니다. 파생 클래스의 새로 생성 된 인스턴스에 "unset"값이 있는지 확인 하시겠습니까? 즉 추상 클래스의 생성자와 함께 할 수있다 :

protected Person() 
{ 
    Name = "Unset Name"; 
    PhoneNumber = "Unset Phone"; 
} 

예, 추상 클래스는 직접 인스턴스화 할 수 있지만, 생성자를 가질 수 있습니다. 기본 클래스의 생성자는 파생 클래스의 생성자보다 먼저 호출되므로 적절한 매개 변수가있을 때마다 파생 클래스의 생성자에서 이러한 "설정되지 않은"값을 덮어 쓸 수 있습니다.

+0

아니요, 정적으로 참조 할 수있는 값이 필요했습니다. 이 클래스의 인스턴스를 기대할 수있는 메소드가 많이 있으며 정의되지 않은/널 (null) 경우에 대해 많은 로직을 처리해야합니다. 기본 값 또는 설정되지 않은 값을 사용하면 작업 할 수있는 모든 null 사례를 처리하는 것보다 쉬울 것이라고 생각했습니다. – celsound

관련 문제