2013-02-14 1 views
0

각 클래스가 추상 기본 클래스에서 파생되는 간단한 클래스 계층 구조가 제공됩니다. 모든 파생 클래스는 기본 클래스가 특정 기본 메서드에서 사용할 열거 형 "값"을 어떻게 든 제공해야합니다.
예 :파생 클래스에서 속성을 구현하는 가장 좋은 방법은 무엇입니까?

기본 클래스 :

public abstract class AbstractFoo 
{ 
    bool SaveFoo() 
    { 
    switch (BarType){...} 
    } 

} 

및 파생 클래스

public class BananaFoo:AbstractFoo 
{ 
    //barttype = fruit; 
} 

public class WhaleFoo:AbstractFoo 
{ 
    //barttype = mammal; 
} 

가 여러 가지 방법으로 내가 AbstractFoo에서 파생 된 모든 클래스 속성 "열거 BarType"

를 구현하는 것이 확인 할 수 있습니다
public abstract BarType BarType{get;} 

각 파생 클래스에서 BarType을 구현하여 올바른 유형을 반환하거나 매우 유사한 일을하는 추상적 인 방법.

public BarType BarType{get{return _bartype;}} 

또는 필드 반환하는 구체적인 방법 추가 - 다음 나는 필드를 추가하는 것을 기억해야합니다,하지만 그건 훨씬 덜 입력 (C & P)?

이렇게하는 것이 바람직한 방법은 무엇입니까?

답변

2

올바른 방법은 무엇인지에 대해서는 말씀 드릴 수 없지만 구현을 강제하기 위해 기본 유형에 항상 추상 속성을 사용하고 하위 유형 속성에서 상수를 반환했습니다.

예를 들어

: 당신이 각 하위 클래스의 열거의 단일 값을 반환하고 가정

public BarType BarType{get{return BarType.WhaleFoo ;}} 
+0

이 내가 늘 해오 던 방식입니다 ...하지만 갑자기 "순간을했다 "너 자신을 의심 할 때! lol – BlueChippy

+0

나는 그 감각을 안다 : 나는이 대답을 게시하는 동안 그것을 가지고 있었다;) – baldric

1

가, 내가 아는 가장 좋은 방법의 기본 클래스에서 추상 속성을 구현하는 것입니다, 다음 구현 그것은 각 어린이 반에있다.

public abstract class A { 
    public BarType Foo; 

    public enum BarType { 
     Value1, 
     Value2 
    } 
} 

public class B : A { 
    public BarType Foo { get { return BarType.Value1; } } 
} 
+0

미안하다, baldric는 그것에 당신을 때린다. – BlueChippy

+0

옙 ... 너무 오랜 시간이 걸려서 예쁜 것처럼 보였습니다. P –

+0

빠른 답변을 얻었으므로 답변을 얻지 못했습니다. 그러면 모양이 좋아 보이게됩니다.) – BlueChippy

5

또 다른 옵션은 기본 클래스에 푸의 값을 전달하는 파생 클래스를 강제하는 것입니다 :

public abstract class A { 
    private readonly BarType _foo; 

    protected A(BarType foo) { 
    _foo = foo; 
    } 

    // Does Foo need to be public or is it only used internally by A? 
    public BarType Foo { get { return _foo; } } 
} 

public class B : A { 

    public B() : base(BarType.Value1) { 
    } 
} 
+0

+1 가능한 선택 사항으로 ... 그러나 나는 이것들을 많이 가질 것이다. , 나는 그것을 피할 수 있다면 거대한 생성자를 원하지 않는다. – BlueChippy

관련 문제