Как вызвать метод интерфейса в своем собственном классе? - PullRequest
2 голосов
/ 22 ноября 2010

Мой класс MySqlConnection реализует интерфейс IDatabaseConnection.В методе обновления я хочу вызвать connect(), но не могу найти этот метод. Как я могу вызвать его?

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

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

Ответы [ 5 ]

7 голосов
/ 22 ноября 2010

Очевидно, что вы используете явную реализацию интерфейса, за исключением того, что ваш синтаксис неверен (вы не должны указывать модификатор доступа к нему).

Чтобы вызвать метод, просто приведите this к IDatabaseConnection:

void IDatabase.update(){

    ((IDatabase)this).connect();
 ...
}
4 голосов
/ 22 ноября 2010

Вы можете использовать:

(this as IDatabase).connect();

Причина в том, что вы реализуете этот интерфейс явно, поэтому вы можете вызывать эти методы только после преобразования. Почему вы реализуете это явно и делаете эти методы private? Я думаю, что более распространенным является то, что в классе соединения есть методы public connect и update

2 голосов
/ 22 ноября 2010

Явная реализация интерфейса:

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

    void IDatabaseConnection.update()
    {
        (this as IDatabaseConnection).connect();
    }
}
<ч />

Скорее лучше - неявная реализация интерфейса:

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

    public void update()
    {
        connect();
    }
}
0 голосов
/ 22 ноября 2010

Кажется, здесь есть пара проблем - ваш MySqlConnection не реализует интерфейс IDatabase, но вы явно реализуете метод в этом интерфейсе?

Это может помочь - возможнонеправильно понял, что вы пытаетесь достичь.

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

0 голосов
/ 22 ноября 2010

Это называется явной реализацией интерфейса. Но если вы напишите свой класс так, он будет работать нормально:

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

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

Обратите внимание, что методы реализованы как публичные методы.

Явная реализация делает их недоступными везде, даже внутри самого класса. Вот почему вы не можете использовать ключевое слово private при их объявлении. Тем не менее, они могут быть доступны "публично" через интерфейс. Если по какой-то веской причине вы действительно хотите использовать явные реализации, вы можете привести к интерфейсу и вызвать оттуда:

((IDatabase)this).connect();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...