2014-09-29 5 views
1

저는 이것을 구현하는 방법에 대해 약간 혼란 스럽습니다.인터페이스 매개 변수

int에 몇 가지 속성이있는 IActivity라는 인터페이스를 정의했습니다.

나는 다음이 인터페이스를 구현하고 몇 가지 추가 속성

EngagementActivity 및 MPEngagementActivity

를 추가 두 개의 클래스를 만들었습니다. 이 두 클래스는 IActivity를 구현하고 몇 가지 추가 속성을 선언합니다.

다음 두 가지 유형의 작업에 공통적 인 모든 기능에 대한 가상 메서드를 구현하는 ActivitySvc라는 기본 클래스가 있습니다.

public abstract void SaveActivity(IActivity activity); 

내 문제가를 구현할 때 나는 오류를 얻고 있다는 것입니다 :

나는 그 기본 클래스에서 파생 및 기본 클래스에 선언 된 SaveActivity 방법의 자신의 구현을 제공해야 할 두 가지 클래스를 구현 SaveActivity 메서드는 내 Activity 개체가 IActivity 유형이므로 EngagementActivity 및 MPEngagementActivity 클래스에 고유 한 멤버가 없기 때문에 가능합니다.

내가 뭘 잘못하고 있니?

미리 감사드립니다.

+0

를 오버라이드 (override)하지 않는 수 추상 클래스에서 가상 메서드를 정의 할 수 있습니다, 당신은 일반적으로 * *이 인터페이스를 구현 단지, 기본 데이터 무엇인지 상관하지 않습니다. 네가 그걸 위반하려고하는 것처럼 들린다. – crashmstr

+0

IActivity 구체적인 클래스의 다른 멤버는 무엇을 나타 냅니까? SaveActivity 메서드에서 직접 액세스하려고하는 대신 EngagementActivity 및 MPEngagementActivity 클래스를 숨기고 IActivity를 통해 노출되는 일반적인 메서드로 논리를 래핑 할 수 있습니까? –

답변

3

가장 좋은 방법 일 수도 있지만 가장 빠른 방법은 관련 방법의 올바른 유형으로 활동 개체를 안전하게 캐스팅하려고하는 것입니다.

예를 들어, EngagementActivity를 사용하는 클래스에서, 당신과 같이 일을 할 수있는 다음 engagementActivity 변수가 null

public override void SaveActivity(IActivity activity) 
{ 
    var engagementActivity = activity as EngagementActivity; 
    if (engagementActivity != null) // it's the correct type 
    { 
     // Do whatever's needed here 
    } 
} 

경우, 당신이로 캐스팅하려고하는 유형은 아니다. 'as'에 대한 자세한 내용은 this MSDN article을 참조하십시오.

+0

이것은 내가 끝내었지만 어떻게 든 그것은 우아한 것처럼 보이지 않는다 ... – franklores

1

SaveActivity에서 기본 유형의 IActivity를 가져 와서 속성을 가져옵니다. 당신은 인터페이스를 사용하는 경우는

public virtual void SaveActivity(IActivity activity) 
{ 
    ... 
    // some common code for all types 
    if(activity is EngagementActivity) 
    { 
     // use explicit type casting '(EngagementActivity)activity' and get your properties 
     // save your data 
     return; 
    } 
    if(activity is MPEngagementActivity) 
    { 
     // use explicit type casting '(MPEngagementActivity)activity' and get your properties 
     // save your data 
     return; 
    } 
    // other activity types 
    ... 
    // if no case fired save data for common activity or throw exception for unknown type 
} 
+0

구현에 따라 ActivityActivity 메서드가 추상화 된 것처럼 선언했지만, 개체를 캐스팅하라는 제안을 구현했다. 올바른 유형. – franklores

관련 문제