2014-01-24 5 views
3

나는이 인터페이스를인터페이스 및 공유 구현

public interface IColumn 
{ 
    bool IsVisible {get;set;} 

    bool IsGroupBy { get; set; } 

    Type CLRType { get; set; } 

    string GetGroupByString(); 

    string GetFilterString(); 
} 

을하고 난 구현이 정확히 동일 처음 3 개 속성에 대한 그것으로부터 상속 클래스를 가지고있다. string GetGroupByString(); 이행을위한

그래서 나는 모든 회원을 IColumn 인터페이스를 상속 구현 ColumnBase라는 추상 클래스를 만들어 내가 INotifyPropertyChanged를 구현해야하기 때문에 백업 필드를 추가

2를 제외한 모든 클래스에 대해 동일합니다.

그리고 내 클래스를 ColumnBase에서 상속 받았으며 같은 의미가 아닌 임 플리 멘 테이션을 오버라이드했습니다.

인터페이스 및 추상 클래스에 대한 경험이 매우 부족합니다. 인터페이스와 클래스를 상속 한 클래스가 있고 모든 속성 및 기능이 아닌 일부 속성의 구현이 동일하다는 것을 알았 으면합니다. 추상 클래스를 만들고 기본 구현을두고 특수 구현 클래스에 재정의합니까?

+3

예, 좋은 해결책 인 것 같습니다. 'virtual'으로 오버라이드 할 수있는 메소드를 표시하고 서브 클래스에서 특정 서브 클래스의 동작을 지정하십시오. –

+0

@ JeroenVannevel하지만 가상은 어떤 차이가 있습니까? – Kanka

+1

변수를 추상화하는 방법에 따라 메소드 숨기기 문제를 방지 할 수 있습니다. [This] (http://msdn.microsoft.com/en-us/library/aa645767(v=vs.71) .aspx)는 분명히해야합니다. –

답변

1

의견과 선호도에 따라 답변을 얻을 수 있습니다.

IMHO, 나는 이것이 추상적 인 방법으로 선언 된 다른 구현을 요구하는 두 가지 방법으로 추상 클래스에 가장 적합하다고 생각한다. 메소드에 대해 abstract를 사용한다는 것은 구현이 그 메소드의 구현을 가져야 함을 의미합니다. 파생 클래스는 기본 클래스의 일부 전문 버전 인 경우

public abstract class ColumnBase 
{ 
    public bool IsVisible { get; set; } 

    public bool IsGroupBy { get; set; } 

    public Type CLRType { get; set; } 

    public virtual string GetGroupByString() 
    { 
     return "base string"; 
    } 

    public abstract string GetFilterString(); 
} 

public class ConcreteColumn : ColumnBase 
{ 
    public override string GetGroupByString() 
    { 
     return "concrete string"; 
    } 

    public override string GetFilterString() 
    { 
     return "who owns the filter string?"; 
    } 
} 
+0

하지만 문자열의 경우 GetGroupByString(); 구현은 2를 제외한 모든 클래스에 대해 동일합니다. 즉 위와 같은 의미는 각 클래스 내에 동일한 구현을 반복해서 작성해야한다는 것입니다. – Kanka

+1

그는 가상으로 만들 수 있고 다른 가상에서는 무시할 수 있습니다. –

+0

답을 명확하게 편집했습니다. –

1

추상 클래스를 만들고 기본 구현을두고 특수 구현 클래스에 재정의합니까?

네, exactly.Actually 그것을 할 것입니다 그것은 종류의 사건 features.In abstract 클래스의 목적과 virtual/override의 난 당신이, 당신은 추상적 인 class.And는 모든 일반적인 구현 사용할 수 있습니다 IColumn 인터페이스를 필요로하지 않는 생각 메소드 내부에서 메소드를 변경 한 다음 메소드의 작동을 변경하려는 경우 중첩 클래스에서이를 대체하십시오.

virtual으로 메소드를 표시하면 중첩 클래스에서 메소드를 대체 할 수 있으며 현재 클래스에 따라이 메소드의 동작을 변경할 수 있습니다. 자세한 내용은 documentation을 참조하십시오.

1

는이 class Rectangle : Shape처럼 기본 클래스에서 상속하는 것이 좋습니다 것입니다. 왜 파생 된 클래스가 모두 같은 특수화 된 버전인지. 예를 들어 직사각형과 원은 실제로 본질적으로 모양입니다. 그러나 개의 다른 개체가 있고 비슷한 동작이 필요한 경우 인터페이스 사용을 고려하십시오. 그들이 있기 때문에 예를 들어, 당신은 그들이 NameAge 속성과 Serialize() 메서드가 기본 클래스를 형성 유도하는 좋은 생각이 아니다, 그들은 단지 NameAge 속성이 경우에도 Bird 객체와 Chair 객체를 직렬화 할 수 있습니다 다른 것들. Serialize() 메소드의 구현은 양쪽 모두 동일하지만 ISerializable 인터페이스를 사용하고 두 클래스 모두에서 구현하는 것이 좋습니다.