2012-07-09 5 views
0

나는 다음 클래스 계층 구조를 가지고, 내가 BaseClassA의 조상에 개체를 캐스팅해야액세스

public abstract class BaseClass : IBaseInterface 
{ 

    public int PropertyA{ 
     get 
     { 
      return this.propertyA; 
     } 

     set 
     { 
      this.propertyA = value; 
      // ... some additional processing ... 
     } 
    } 
} 

DerivedClassB : BaseClass 
{ 
    // some other fields 
} 

public class ContainingClassC 
{ 
    public IBaseInterface BaseInterfaceObjectD 
    { 
     get; 
     set; 
    } 
} 

자, DerivedClassB - 객체의 PropertyA에 액세스하려면 (BaseClass로에서 상속을) like :

// This ContainingClassC is returned from a static, enum-like class: 
// containingObject.PropertyA is DerivedClassB by default. 
ContainingClassC containingObject = new ContainingClassC(); 

((IBaseInterface)containingObject.BaseInterfaceObjectD).PropertyA = 42; 

캐스트를 제거하기 위해 이러한 클래스를 재구성 할 수있는 방법이 있습니까? 이 코드는 라이브러리의 일부이며 동료는 캐스트를 제거하기를 원합니다.

목표는 단순히 containingObject.BaseInterfaceObjectD.PropertyA = 42으로 작성하는 것입니다.

+0

설명과 코드가 상당 부분 일치하지 않습니다. 하나를 다른 사람과 나란히 가져 오십시오. – Jon

+0

죄송합니다. 작업 중입니다. – lowerkey

+3

'((IBaseInterface) containingObject.BaseInterfaceObjectD)'이미 인터페이스 유형입니다. 너 왜 캐스팅하니? – leppie

답변

0

먼저 ((IBaseInterface)containingObject.BaseInterfaceObjectD).PropertyA = 42; 줄에서 선언 된 것과 동일한 유형으로 멤버를 캐스팅하므로 실제로 캐스팅이 수행되지 않습니다.

파생 클래스에서 PropertyA에 액세스하려면 - 인터페이스에 캐스팅하므로이 속성은 인터페이스에서 선언 된 다음 BaseClass에 구현되어야합니다.

public interface IBaseInterface{ 
    int PropertyA{get;set;} 
} 

public abstract class BaseClass : IBaseInterface{ 
    public int PropertyA{ 
    get{ return this.propertyA;} 
    set {this.propertyA = value;} 
    } 
} 

은 긴 인터페이스가 제대로 구현 될 때, ProprtyA 기본 클래스, 파생 된 클래스 또는 인터페이스 유형 cast'ed 그들 중 하나와 함께 사용할 수 있어야.

IntelliSense에 표시되지 않는 속성의 문제 일 경우 설정에 문제가있을 수 있습니다. 옵션 -> 텍스트 편집기 -> C#을 확인하고 IntelliSense가 켜져 있고 anythig를 숨기지 않도록 설정했는지 확인하십시오.

+0

간단 할 수도 있지만 이것이 아마도 문제 일 것입니다. 주어진 구현은 어떤 종류의 캐스팅도 필요로하지 않아야합니다. 따라서 OP가 구체적인 유형으로 캐스팅해야하는 경우 이것이 아마도 이유입니다. – James