2013-06-20 3 views
4

У меня есть интерфейс, как показано ниже:проблема C# Интерфейс с областью видимости функции

public interface IInterface 
{ 
    void Open(); 
    void Open(bool flag); 
    void Open(bool flag, bool otherFlag); 
} 

Теперь при реализации интерфейса я имею следующее:

public class IClass : IInterface 
{ 
    void IInterface.Open() 
    { 
     Open(false, false); 
    } 

    void IInterface.Open(bool flag) 
    { 
     Open(flag, false); 
    } 

    void IInterface.Open(bool flag, bool otherFlag) 
    { 
     //Do some stuff 
    } 
} 

Теперь проблема я встречая, что в первые два тела функции в IClass, я не могу назвать третью функцию. Я получаю ошибку:

The name 'Open' does not exist in the current context

Ладно, так что я реализующий интерфейс явно (в связи с требованием от другой команды в организации), а затем я получаю «Open» контекста вопроса. Я могу удалить явный IInterface из трех открытых методов, а затем я могу успешно скомпилировать, даже если другие методы (не перечисленные здесь) реализованы явно, но я не уверен, каковы последствия этого.

Есть ли способ вызвать третий метод при явной реализации методов интерфейса?

Спасибо!

ответ

7

Явные реализации требуют применения ссылка на тип интерфейса напрямую, даже внутри класса реализации:

void IInterface.Open() 
    { 
     (this as IInterface).Open(false, false); 
    } 

    void IInterface.Open(bool flag) 
    { 
     (this as IInterface).Open(flag, false); 
    } 

Другим способом сохранить явную реализацию является делегированием вызовов частного метода:

private void Open(bool flag, bool otherFlag) 
    { 
     // Do some stuff. 
    } 

Ваших звонки теперь привязать к этому методу:

void IInterface.Open() 
    { 
     Open(false, false); 
    } 
    void IInterface.Open(bool flag) 
    { 
     Open(flag, false); 
    } 
    void IInterface.Open(bool flag, bool otherFlag) 
    { 
     Open(true, true); 
    } 

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

3

Вы можете сделать:

((IInterface)this).Open(false, false); 

Одна вещь, которую вы могли бы рассмотреть делает другие методы расширения Перегрузки на IInterface вместо повторного внедрения их каждый раз:

public static void Open(this IInterface iface, bool flag) 
{ 
    iface.Open(flag, false); 
} 
1

Просто убедитесь, что вы относитесь к this объекту явно как интерфейс литья его первым:

void IInterface.Open(bool flag) 
{ 
    ((IInterface)this).Open(flag, false); 
} 
1
void IInterface.Open() 
{  
    (this as IInterface).Open(false, false); 
} 
Смежные вопросы