2013-02-14 2 views
0

으로 변경할 수 있습니다. 하위 클래스의 변수를 무시할 수있는 방법이 있지만 유형을 해당 유형의 하위 클래스로 변경하십시오. 예.하위 클래스의 클래스 변수를 무시하고 그 유형을 하위 클래스

public class BaseClass 
{ 
    public BaseClass() { } 
    protected virtual MyBase WorkField { get { return new MyBase(); } } 
    public int WorkProperty 
    { 
     get { return WorkField.Value; } 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    public DerivedClass():base() { } 

    /* I get an error here saying that WorkField needs to be MyBase type*/ 
    protected override MyExtend WorkField 
    { 
     get 
     { 
      return new MyExtend(); 
     } 
    } 

    //public new int WorkProperty 
    //{ 
    // get { return 0; } 
    //} 
} 

public class MyBase 
{ 
    public int Value = 1; 
} 

public class MyExtend : MyBase 
{ 
    public int value = 20; 
} 

이 방법은 이와 유사하지만 유효합니까? 그래서 MyBase에서 작업을 수행하는 SuperClass를 가질 수 있으며 MyEntend 버전의 작업을 수행하는 하위 클래스를 가질 수 있습니다. 사용할 때마다 전송하지 않아도됩니다.

답변

1

이 경우 서명을 변경할 이유가 없습니다. 파생 형식을 반환하면됩니다.

public class DerivedClass : BaseClass 
{ 
    public DerivedClass():base() { } 

    protected override MyBase WorkField 
    { 
     get 
     { 
      return new MyExtend(); 
     } 
    } 

    //public new int WorkProperty 
    //{ 
    // get { return 0; } 
    //} 
} 

하위 클래스의 다형성 동작을 사용하면 반환 할 수 있습니다.

0
public class BaseClass<T> where T: MyBase, new() 
    { 
     public BaseClass() { } 
     protected virtual T WorkField { get { return new T(); } } 
     public int WorkProperty { get { return WorkField.Value; } } 
    } 

    public class DerivedClass : BaseClass<MyExtend> 
    { 
     public DerivedClass() : base() { } 
     protected override MyExtend WorkField { get { return new MyExtend(); } } 

     //public new int WorkProperty 
     //{ 
     // get { return 0; } 
     //} 
    } 

    public class MyBase 
    { 
     public MyBase() 
     { 

     } 
     public int Value = 1; 
    } 
    public class MyExtend : MyBase 
    { 
     public int value = 20; 
    } 
1

서명을 재정의하려면 기본 기본 방법이어야합니다.

public class BaseClass<T> where T : MyBase, new() 
{ 
    public BaseClass() { } 
    protected virtual T WorkField { get { return new T(); } } 
    public int WorkProperty { get { return WorkField.Value; } } 
} 

public class DerivedClass : BaseClass<MyBase> 
{ 
    public DerivedClass() : base() { } 

// 같은 오류는 기본 속성은 "MyBase는"유형의로 발생

보호 우선 MyExtend WorkField {{) (새 MyExtend을 반환받을; }}

//public new int WorkProperty 
    //{ 
    // get { return 0; } 
    //} 
} 
관련 문제