2010-05-05 3 views
0

나는이 질문에 대한 좋은 제목을 생각해 내는데 어려움을 겪었으므로 제안을 환영한다.일반적인 기본 클래스를 가진 객체를 얻는 최상의 느슨한 방법

public abstract class ActionBase 
{ 
    public abstract string Name { get; } 
    public abstract string Description { get; } 

    // rest of declaration follows 
} 

그리고 우리는 이러한 조치가 노동자에 집착 등 MoveFileAction, WriteToRegistryAction 같이, 정의 된 다른 작업의 무리가 있습니다

의 우리는 다음과 같은 형태 추상 기본 클래스 ActionBase 있다고 가정 해 봅시다 개체 :

public class Worker 
{ 
    private IList<ActionBase> _actions = new List<ActionBase>(); 
    public IList<ActionBase> Actions { get { return _actions; } } 

    // worker stuff ... 
} 

지금까지 꽤 간단했습니다. 이제는 Workers 설정, 작업 할당, 속성 설정 등의 UI가 필요합니다. 이 UI에서는 사용 가능한 모든 액션 목록을 속성과 함께 제시하고자합니다. 먼저 사용할 수있는 액션의 이름과 설명 (유형 포함)을 모두 다음과 같은 컬렉션으로 모으고 싶습니다. 항목 유형 :

public class ActionDescriptor 
{ 
    public string Name { get; } 
    public string Description { get; } 
    poblic Type Type { get; } 
} 

물론이 방법으로 리플렉션을 사용할 수 있지만 더 좋은 방법이 있습니까? 이름과 설명을 ActionBase의 인스턴스 속성으로 설정하면 (파생 클래스의 정적 속성과 반대) 약간의 냄새가 날지 만 C#에는 추상 정적이 없습니다.

감사합니다.

+0

정적 상속의 개념이 없기 때문에 '정적 인 추상화'가 없습니다. –

+0

'정적 추상'에 대해 논쟁하지 않고 단지'abstract' 키워드가 계약을 시행하는 데 도움이된다는 것을 지적합니다. –

+0

아마 나는 정교해야한다. 나는 정적 인 추상에 대해 논쟁하지 않고 있으며, 왜 C#에서 그것을 가지고 있지 않은지 이해합니다. 내가 의미했던 것은 Name과 Description 프로퍼티가 실제로 오브젝트 인스턴스에 많은 의미를 부여하지는 않지만, 각 구현이 이름과 설명을 갖도록 강요하고, 그와 계약을 강제 할 방법이 없다는 것입니다. static 속성. –

답변

2

당신이 말하고자하는 것은 구체적 동작 클래스에 대해 설명하는 메타 데이터를 만드는 것입니다. 이름 및 설명의 간단한 예를 들어, 나는 표시 이름을 추천 및 설명은 다음과 같이 속성 :

[DisplayName("MyAction Name")] 
[Description("My description goes here")] 
public class MyAction : ActionBase 
{ 
    //Declaration goes here 
} 

이러한 속성은 System.ComponentModel에 정의되어 있습니다.

+0

감사합니다. Dan. 그런 접근 방식을 사용하면 여전히 목록을 수집하기 위해 리플렉션을 사용합니까? –

+0

예, ActionBase 유도체 찾기를 반영한 ​​다음 Attribute.GetCustomAttribute를 사용하여 속성을 검색합니다. –

+0

이 시나리오의 리플렉션에는 어떤 대안이 있습니까? –

0

ActionDescriptor를 반환하는 추상 메소드를 ActionBase에 추가 한 다음 각 액션에 해당 설명자를 쿼리 할 수 ​​있습니다.

+0

댄, 나는 여전히 어떻게 든 행동 목록을 얻어야 할 것입니다. –

+0

오른쪽. 나는 ActionManager와 같은 것을 사용하는 프로젝트로 작업하고있다. ActionManager는 각각의 액션이 생성시에 등록된다. 그런 다음 작업 목록에 대해 mgr을 쿼리 할 수 ​​있습니다. – DanJ

+0

전에이 패턴을 구현했습니다.내가 그것에 대해 좋아하지 않는 비트는 모든 행동이 스스로 등록되도록하기 위해 인공적으로 인스턴스화되어야한다는 것입니다. –

관련 문제