2012-06-19 7 views
1

Я пытаюсь реализовать Windows Update Agent API асинхронные методы загрузки/установки, однако, у меня возникли проблемы, реализующий классы обратного вызова (IInstallationProgressChangedCallback и т.д.)Нет подходящий метод не нашел переопределить из-взаимодействия интерфейса

Вот пример реализации класс, который не работает using System; с использованием WUApiLib;

namespace ConsoleApplication1 
{ 
    class DownloadProgressCallback : IDownloadProgressChangedCallback 
    { 
     public override void Invoke(IDownloadJob downloadJob, IDownloadProgressChangedCallbackArgs callbackArgs) 
     { 
      Console.WriteLine("Do something"); 
     } 
    } 
} 

Всякий раз, когда я пытаюсь скомпилировать проект, содержащий этот класс, я получаю

ConsoleApplication1.DownloadProgressCallback.Invoke(WUApiLib.IDownloadJob, WUApiLib.IDownloadProgressChangedCallbackArgs)': no suitable method found to override 

Для справки, вот как определяется интерфейс (метаданные):

#region Assembly Interop.WUApiLib.dll, v2.0.50727 
// F:\src\ConsoleApplication1\ConsoleApplication1\obj\x86\Debug\Interop.WUApiLib.dll 
#endregion 

namespace WUApiLib 
{ 
    [InterfaceType(1)] 
    [Guid("8C3F1CDD-6173-4591-AEBD-A56A53CA77C1")] 
    [TypeLibType(384)] 
    public interface IDownloadProgressChangedCallback 
    { 
     void Invoke(IDownloadJob downloadJob, IDownloadProgressChangedCallbackArgs callbackArgs); 
    } 
} 

Я не очень знакомы с COM/Interop, поэтому я потерял то, что я делаю неправильно здесь.

ответ

3

При реализации интерфейса вам не нужно использовать override. Просто написать:

public void Invoke(IDownloadJob downloadJob, IDownloadProgressChangedCallbackArgs callbackArgs) 
    { 
     Console.WriteLine("Do something"); 
    } 

override ключевое слово используется, когда наследование от базового класса, и «переопределение» унаследованный виртуальный (или абстрактным) метод базового класса. Для получения дополнительной информации см. override.

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

void IDownloadProgressChangedCallback.Invoke(IDownloadJob downloadJob, IDownloadProgressChangedCallbackArgs args) 
{ //... 

Это позволяет реализовать интерфейс таким образом, чтобы не «загрязнять» классы общественного API, или предоставляют различные реализации двух интерфейсов, которые имеют члены с теми же названиями и типами.

+0

О, мальчик, я чувствую себя глупо! Спасибо! – AdmiralNemo

+0

Я провел последний час для устранения неполадок, просто потому, что VS2005 автоматически добавляет ключевое слово 'override', выполняя операцию« Интерфейс реализации ». Мне это нравится (MS-мир) !!!! Спасибо за ваш ответ –

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

  • Нет связанных вопросов^_^