2009-12-23 6 views
0
Public class ClassB : ClassA 
{ 
} 

public class GeneralClass 
{ 
    public ClassA test 
    { 
     get{} 
     set{} 
    } 
} 
public class specificClass :GeneralClass 
{ 
    public ClassB test 
    { 
     get{} 
     set{} 
    } 
} 

는 특성 시험은 generalClass에서 specificClass에 상속되지만, 여기에 내가 ClassB가 (ClassB:ClassA)에 유형을 변경하려면 볼 수 있듯이. 이렇게하면 언제든지 사용할 수 있나요? specializedClass.test 클래스 B로 유형 변환 할 필요가 없습니다.재산 상속

편집 1 : 나는 이제 그에게 내게 경고를주는 걸 잊었습니다. 테스트 숨기기 상속 된 회원 테스트 .use 숨기기가 의도 된 새로운 키워드.

+3

. 나는 당신의 목표가 무엇인지 확신 할 수 없다. – JustLoren

+1

나는'specificClass'가'GeneralClass'를 상속해야한다고 생각하는데, 이것은 당신의 예제에서는 그렇지 않다! – Vinz

+0

또한 속성 정의에 유형과 이름이 섞여 있습니다. 그것은'public ClassA test {get; 세트; }' – Vinz

답변

6

메서드 및 속성을 재정의 할 때 반환 유형을 수정할 수 없습니다. C#은 return type covariance을 지원하지 않습니다. 당신이 속성을 재정의 할 필요가 그냥 어떤 특정 유형의 주조 기본 값을 반환하지 않으려면 그런데

, 당신은 기본 클래스를 숨기기 위해 new property을 선언 할 수 있습니다. 반환 유형 공분산이 아니라는 점에 유의하십시오. 그것은 동일한 이름을 가지고 어떻게 그냥 별개의 재산이다 : 메서드와 속성을 overridding 때을 사용하는 것이 안전 할 수있다하더라도, 기본 방법/속성으로 동일한 유형을 사용해야합니다

public new ClassB test { 
    get { return base.test as ClassB; } 
    set { base.test = value; } 
} 
0

아강. new 키워드를 사용하여 속성을 숨길 수는 있지만 기본 클래스에서 호출 될 때 사실상 전달되지는 않습니다.

0

Mehrdad Afshari가 방금 작성하려고했던 내용을 반영하여 질문을 업데이트했습니다. 기본적으로 원하는 것은 다음과 같습니다.

public class ClassA 
    { 

    } 

    public class ClassB : ClassA 
    { 

    } 

    public class GeneralClass 
    { 
     public ClassA myClass { get; set; } 
    } 

    public class SpecificClass : GeneralClass 
    { 
     new public ClassB myClass { get; set; } 
    } 

    public myFunction() 
    { 

     var sc = new SpecificClass(); 

     sc.myClass = new ClassB(); 

     Console.WriteLine("sc.GetType() = " + sc.myClass.GetType()); 

     var gc = (GeneralClass)sc; 

     gc.myClass = new ClassA(); 

     Console.WriteLine("gc.GetType() = " + gc.myClass.GetType()); 

     Console.WriteLine("sc.GetType() = " + sc.myClass.GetType()); 
    } 
0

제네릭으로 해결할 수있는 정확한 문제에 따라 다릅니다.

주 (그러나 가지 복잡) : GeneralClass : AbstractGeneralClassSpecificClass : AbstractGeneralClass

할 수 있습니다 :

  • 저장 GeneralClass의 인스턴스와 AbstractGeneralClass
  • 액세스 testAsClassA에서 SpecificClass 당신이 유형 AbstractGeneralClass의 변수가있는 경우
  • ClassB test 변수가인 경우
class ClassA { } 
    class ClassB : ClassA { } 

    abstract class AbstractGeneralClass 
    { 
     /* functionality that does not depend on test */ 

     public abstract ClassA testAsClassA { get; } 
    } 

    abstract class AbstractGeneralClass : AbstractGeneralClass where T : ClassA 
    { 
     T myProperty; 
     public T test 
     { 
      get { return myProperty; } 
      set { myProperty = value; } 
     } 

     public override ClassA testAsClassA { get { return myProperty; } } 
    } 

    class GeneralClass : AbstractGeneralClass { } 

    class SpecificClass : AbstractGeneralClass { } 
나는이 순간에 이해가되지 않는 한, 귀하의 예를 정리 제안