2010-11-22 7 views
1

내 MySqlConnection 클래스는 IDatabaseConnection 인터페이스를 구현합니다. 업데이트 방법에서 connect()을 호출하려고하지만이 방법을 찾을 수 없습니다. 어떻게 호출 할 수 있습니까?고유 한 클래스에서 인터페이스 메서드를 호출하는 방법은 무엇입니까?

class MySqlConnection : IDatabaseConnection 
{ 
    void IDatabaseConnection.connect() 
    { 
     ... 
    } 

    void IDatabaseConnection.update() 
    {   
     connect(); // here 
     ... 
    } 
} 
+0

'IDatabaseConnection'와'IDatabase' 사이의 상관 관계는 무엇인가? – abatishchev

+0

@abatishchev : 나는'IDatabaseConnection' 만 있어야한다고 생각합니까? –

+0

오, 고마워. 나는 지금 그것을 바꾼다 –

답변

6

명백히 인터페이스 구현을 사용하고 있습니다. 단, 구문이 올바르지 않습니다 (액세스 한정자를 지정하면 안됨).

는 방법, 단지 IDatabaseConnectionthis 캐스트를 호출하려면 :

명시 적 인터페이스 구현이라고
void IDatabase.update(){ 

    ((IDatabase)this).connect(); 
... 
} 
+0

+1. 물론 다른 대안은 바람직하지 않은 경우가 아니라면 암시 적으로 인터페이스를 구현하는 것입니다. – Ani

+0

연산자'as '는 (약간) 빠르다가'cast', 작동하지 않습니까? – abatishchev

+2

@abatishchev : 'as'와 일반 캐스트를 선택하는 이유는 성능이 아닙니다. 그것은 그들의 행동입니다. 'as '는 실패 할 때'null'을 생성하고, 반면 정규 캐스팅은 예외를 던질 것입니다. –

4

당신은 사용할 수 있습니다 : 당신은 단지 변환 후 이러한 메소드를 호출 할 수 있도록

(this as IDatabase).connect(); 

이유는, 명시 적으로이 인터페이스를 구현하는 것입니다. 왜 명시 적으로 구현하고 이러한 메서드를 만들지 만 private? 연결 클래스에 publicconnectupdate 메서드가있는 것이 더 일반적이라고 생각합니다.

+1

이것은 좋은 방법이 아니다. 여기서는 명시 적 캐스트를 사용하는 것이 좋습니다. 'as'는 캐스트가 실패 할 때 사용되어야하고, 보통'null' 테스트가 뒤따라야합니다. – Ani

+0

@Ani : 좋은 지적이지만, 컴파일러가 캐스트에 대해 신경 쓰지 않기 때문에 여기서는 차이가 없습니다. –

+0

@Martinho Fernandes : 이것은 대략 가독성을 강조한 것입니다. 코드의 독자로서, 나는이 캐스트가 실패 할지도 모른다는 생각에 빠지게 될 것이다. null-dereferencing 문제가있을 수 있습니다. 정적 코드 분석 도구에서도 마찬가지입니다. – Ani

0

. 이처럼 클래스를 작성한다면 정상적으로 작동 : 메소드는 public 메소드로 구현됩니다

class MySqlConnection : IDatabase 
{ 
    public void connect() 
    { 
     ... 
    } 

    public void update() 
    {   
     connect(); // here 
     ... 
    } 
} 

공지있다.

명시 적으로 구현하면 클래스 자체 내 어디에서나 액세스 할 수 없게됩니다. 그렇기 때문에 키워드를 선언 할 때 키워드를 사용할 수 없습니다. 그러나 인터페이스를 통해 "공개적으로"액세스 할 수 있습니다. 좋은 이유 당신이 정말로 명시 적 구현을 ​​사용하려면 당신은 거기에서 인터페이스로 캐스팅하고 호출 할 수 있습니다

((IDatabase)this).connect(); 
2

명시 적 인터페이스 구현 :

class MySqlConnection : IDatabaseConnection 
{ 
    void IDatabaseConnection.connect() 
    { 
     // 
    } 

    void IDatabaseConnection.update() 
    { 
     (this as IDatabaseConnection).connect(); 
    } 
} 

오히려 더 나은 - 암시 인터페이스 구현 :

class MySqlConnection : IDatabaseConnection 
{ 
    public void connect() 
    { 
     // 
    } 

    public void update() 
    { 
     connect(); 
    } 
} 
+0

암묵적인 구현이 더 나은 이유는 무엇이라고 생각하십니까? 나는 보통 동의하지만, 아마도 OP는 명시 적 구현을 ​​사용하는 좋은 이유가 있습니다 ... –

+1

+1 암시 적으로 구현하면 대부분의 상황에서 더 합리적이라고 동의합니다. –

+0

@ 토마스 : 명시 적 구현은 동일한 이름의 메소드로 2 개의 인터페이스를 상속 한 경우에만 구현해야한다고 생각합니다. 'IFoo : Do()'와'IBar : Do()' – abatishchev

0

여기에 몇 가지 문제가있는 것 같습니다. MySqlConnection은 IDatabase 인터페이스를 구현하지 않지만 명시 적으로 해당 인터페이스에 메서드를 구현하고 있습니까?

이것은 도움이 될 수 있습니다. - 나는 당신이 달성하고자하는 것을 오해했을 수도 있습니다.

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

관련 문제