2012-06-22 4 views
5

나는 모두가 아주 가까이 보이는 따라 SO 기사파생 클래스

를 읽고 내 질문과 좋은 답변을 가지고 있지만, 내 질문에 대답하지 않는 것 이외의 방법을 비 정적으로 말할 필요가 없습니다.

예 : derivedB이 속성 1,2,10,11있을 것입니다 동안

abstract public class baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property1","property2"}); 
    // code for property definition and access 
    virtual public static bool ValidAttribtue(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
      return true; 
     else 
      return false; 
    } 
} 
class derivedA : baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property3","property4"}); 
    // code for property definition and access 
    public static override bool ValidAttribute(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
     { 
      return true; 
     } 
     else 
     { 
      return base.ValidAttribute(attributeName); 
     } 
    } 
} 
class derivedB : baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property10","property11"}); 
    // code for property definition and access 
    public static override bool ValidAttribute(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
     { 
      return true; 
     } 
     else 
     { 
      return base.ValidAttribute(attributeName); 
     } 
    } 
} 

derivedA 속성 1,2,3,4있을 것입니다. 속성 목록이 클래스 별 값인 것처럼 보입니다. 언제든지 변경할 수 없습니다. 나는 그때 그것이 정적이라고 생각할 것이다.

정적 인 방법을 사용하지 말아야한다는 의미에서 디자인이 잘못 되었습니까?

위의 예는 정적 메서드의 상속이 필요할 것이라고 생각하게 만듭니다. 그러나이 작업을 시도하면 설계상의 결함이있는 것처럼 보입니다. 누구든지 이런 식으로 클래스를 코딩하거나 구조화하는 데있어 잘못된 점을 이해할 수 있도록 도와 줄 수 있습니까?

+0

이 실제 코드인가? 가상 정적 멤버는 가질 수 없습니다. –

+0

아니, 가능하다고 생각했던 작업의 예제 코드 일뿐입니다. –

답변

8

정적 인 방법을 사용하지 말아야한다는 의미에서 디자인이 잘못 되었습니까?

예. 그 외에도 정적 메서드를 virtual으로 선언 한 다음 다시 정의하려고합니다. 허용되지 않습니다. 또한 키워드 인 경우 base이라는 클래스를 선언하려고합니다.

정적 메서드는 단순히 다형성이 아닙니다. 다형성의 기본은 관련 인스턴스의 실행 시간 유형이 표현식의 컴파일 타임 유형과 다를 수 있으며 구현이 실행 시간 유형을 기준으로 선택된다는 것입니다. 이 개념은 정적 메서드에는 의미가 없습니다. 인스턴스가 아닙니다.

이제 물론 파생 클래스에서 정적 메서드를 기본 클래스의 정적 메서드를 호출 할 수 있습니다 -하지만 거기에 다형성이 없을 것입니다. 보조 노트로

, 당신의 모든 방법은보다 읽기 쉬운 방식으로 작성 될 수있다 :

// Base class implementation 
return attributeNames.Contains(attributeName); 

// Derived class implementations 
return attributeNames.Contains(attributeName) || 
     BaseClass.ValidAttribute(attributeName); 
+0

올바르게 이해하고 있는지 확인하기 위해 추상 클래스는 모든 파생 클래스가 가질 연산을 정의합니다. 파생 클래스에는 거기에있는 기능이 필요합니다. 검사는 변경되지 않으며 컴파일 타임에 완전히 정의됩니다. 속성의 유무는 컴파일 타임에 알려집니다. 검사는 클래스별로 변경해야하지만 기본 클래스 기능을 활용할 수 있어야합니다. 이 건물은 서로 정적 인 메커니즘이 아니라 다형성 메커니즘입니다. –

+0

@JohnGroman : 다형성이 필요하지 않은 경우 - 즉실행 시간에 인스턴스의 유형에 따라 "올바른"구현을 호출하면 다형성없이이 작업을 수행 할 수 있습니다. 메서드를 다른 이름으로 지정하여 실제로 다형성이 없다는 것을 분명하게 알 수 있지만 파생 클래스의 정적 메서드로 기본 클래스의 정적 메서드를 호출하면 작동합니다. 언어와 관련된 한 가지 정적 방법 일뿐입니다. 두 언어 간에는 아무런 관계가 없습니다. –

+0

답변 및 의견을 주셔서 감사합니다. 다형성에 대해 더 자세히 읽어야합니다. 또한 더 읽기 쉬운 형태에 감사드립니다. –