2010-07-26 1 views
5

Я не могу это сделатьКак реализовать интерфейс явно с помощью виртуального метода?

interface InterfaceA 
{ 
    void MethodA(); 
} 

class ClassA : InterfaceA 
{ 
    virtual void InterfaceA.MethodA() 
    // Error: The modifier 'virtual' is not valid for this item 
    { 
    } 
} 

Где следующие работы

class ClassA : InterfaceA 
{ 
    public virtual void MethodA() 
    { 
    } 
} 

Почему? Как обойти это?

+1

Почему вы хотите обойти это? Какая польза от этого? –

+0

@ Эрик Это сэкономит мне несколько цифр –

+0

Как не разрешено помечать явный метод интерфейса как виртуальный, потому что вы больше набираете текст? –

ответ

8

Я думаю, что это происходит потому, что, когда член явно реализован, он не может получить доступ через класса, но только через экземпляр интерфейса.

Так что создание чего-то «виртуального» действительно не имеет смысла в этом случае, поскольку виртуальный означает, что вы намерены переопределить его в унаследованном классе. Внедрение интерфейса явнои, что делает его virtual противоречивым. Это также может быть причиной отказа компилятора.

Чтобы обойти это я думаю csharptest.net's или Philip's ответ звучит, как он будет делать трюк

+0

Хорошее объяснение, почему это не имеет смысла хотеть этого. – user276648

0

Вы не можете использовать виртуальный модификатор со статическим, абстрактным, частным или переопределить модификаторы. модификатор по умолчанию является частным

+0

Интересно, что для явных реализаций модификатор является общедоступным, хотя доступ к нему возможен только в том случае, если экземпляр передан в соответствующий тип интерфейса. –

3

Согласно C спецификация # языка:

Это ошибка времени компиляции для явного члена интерфейса , чтобы включить модификаторы доступа , и это компиляция ошибка включения модификаторов аннотация, virtual, override или статические.

Вы можете «обойти» его только путем вызова своего виртуального метода из явной реализации интерфейса.

3

Вы должны сделать что-то вроде этого:

interface InterfaceA 
{ 
    void MethodA(); 
} 

class ClassA : InterfaceA 
{ 
    void InterfaceA.MethodA() 
    { MethodB(); } 

    protected virtual void MethodB() 
    { 
    } 
} 

Часто это превосходный подход в любом случае в качестве внутреннего метода может изменить подпись без изменения интерфейса. Возьмите больше реального слова пример:

interface IOrderDetails 
{ 
    void PlaceOrder(); 
} 

//Sometime later you extend with: 
interface IOrderDetails2 : IOrderDetails 
{ 
    void PlaceOrder(IUser user); 
} 

//Implementation 
class Order : IOrderDetails, IOrderDetails2 
{ 
    static readonly IUser AnonUser; 

    void IOrderDetails.PlaceOrder() 
    { OnPlaceOrder(AnonUser); } 
    void IOrderDetails2.PlaceOrder(IUser user) 
    { OnPlaceOrder(user); } 

    protected virtual void OnPlaceOrder(IUser user) 
    { 
    } 
} 

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

Смежные вопросы