2011-04-06 4 views
1

는 원래 코드는 다음과 같다 : 여기서 제네릭을 사용하는 것이 합리적입니까?

public interface IApplicableSystem 
{ 
    string Name { get; } 

    void Apply (); 
} 

public class Effector 
{ 
    public string Name { get; set; } 
} 

public class EffectSystem : IApplicableSystem 
{ 
    Effector Internal { get; set; } 

    public string Name 
    { 
     get { return this.Internal.Name; } 
    } 

    RelayCommand applyCommand; 
    public ICommand ApplyCommand 
    { 
     get 
     { 
      if (applyCommand == null) 
       applyCommand = new RelayCommand (p => this.Apply ()); 

      return applyCommand; 
     } 
    } 

    public void Apply () 
    { 

    } 

    public EffectSystem (Effector value) 
    { 
     this.Internal = value; 
    } 
} 

그래서 IApplicableSystem을 구현하는 다양한 종류가 있습니다, 그들의 Name 재산, Apply 방법 및 클래스 내에서 사용되는 민간 Internal 재산의 유형입니다 다른 모든 곳.

나는이

이 합리적이다? :처럼 그들을 만들기 위해 일반적인 사용해야합니까? 주로 IApplicableSystem을 구현하는 다른 유형의 코드를 줄입니다.

public abstract class GenericSystem<T> : IApplicableSystem 
{ 
    protected T Internal { get; set; } 

    public virtual string Name 
    { 
     get { return String.Empty; } 
    } 

    RelayCommand applyCommand; 
    public ICommand ApplyCommand 
    { 
     get 
     { 
      if (applyCommand == null) 
       applyCommand = new RelayCommand (p => this.Apply ()); 

      return applyCommand; 
     } 
    } 

    public virtual void Apply () 
    { 

    } 

    public GenericSystem (T value) 
    { 
     this.Internal = value; 
    } 
} 

public class EffectSystemGeneric : GenericSystem<Effector> 
{ 
    public override string Name 
    { 
     get { return GetUniqueName (base.Internal.Name); } 
    } 

    public override void Apply () 
    { 
     Console.WriteLine ("Do something"); 
    } 
} 

답변

2

그렇습니다.하지만 가상 메서드를 재정의 할 때는 가상이 아닌 override 키워드를 사용해야합니다. 구현 자에게 구현을 제공하도록 일반 기본 클래스를 대신 추상화 할 수 있습니다.

+0

감사합니다. –

1

예, Internal 속성의 유형이 다양하기 때문에 제네릭이 의미가 있습니다. 그렇지 않은 경우 비 제너릭 기본 클래스가 올바르게 작동합니다. 해당 인터페이스를 구현하는 것이

public class GenericSystem<T> : IApplicableSystem where T : IName 
INameName 속성이있는 인터페이스입니다

Effector, 따라서 당신은 이동할 수 있습니다 다음 Name 속성은 항상 Internal.Name 될 경우

, 당신은 클래스를 선언 할 수 있습니다 모든 클래스를 무시하는 대신 기본 클래스에 Name 속성을 정의합니다.

+0

감사합니다. 불행히도 Name 속성의 정의가 변경되었지만 이것이 내 통제 범위를 벗어납니다. –

관련 문제