Возможно ли не реализовать метод, унаследованный от интерфейса в C #? - PullRequest
0 голосов
/ 04 августа 2010

Глядя на Project Server 2010 SDK (найден здесь в .NET Reflector, я обнаружил кое-что интересное, которое меня смущает.

Очевидно, класс SvcProject.ProjectClient в ProjectServerServices.dll наследуется от System.ServiceModel.ClientBase<Project>, который является абстрактным классом, реализующим интерфейс System.IDisposable. Однако, когда я проверяю класс SvcProject.ProjectClient (который не является абстрактным), метода Dispose нет. Что дает? Я думал, что каждый метод, унаследованный от интерфейсов, должен быть реализован в конкретной реализации (в противном случае, что такое использование интерфейсов). .NET Reflector лжет мне? Microsoft почему-то обошла это требование? Что происходит?

Ответы [ 2 ]

9 голосов
/ 04 августа 2010

Вероятно, это было реализовано явно , например:

void IDisposable.Dispose()
{
    // Code here
}

Либо это, либо он наследует метод от базового класса. Тот факт, что ClientBase<T> является абстрактным, не означает, что он не может правильно реализовать IDisposable. Действительно, будет иметь , чтобы либо реализовать его, либо повторно объявить его как абстрактный метод, чтобы заставить производный класс его реализовать.

В любом случае, метод будет каким-то образом.

Явная реализация интерфейса означает, что метод доступен только при просмотре экземпляра через тип интерфейса. Например:

class Foo : IDisposable
{
    void IDisposable.Dispose() {}
}

...

Foo foo = new Foo();
foo.Dispose(); // Invalid: compile time error
IDisposable d = foo;
d.Dispose();   // Valid
((IDisposable)foo).Dispose(); // Valid (no need for temp variable)
6 голосов
/ 04 августа 2010

Не глядя, я бы сказал, что базовый класс предоставляет метод Dispose, а конкретный класс просто не переопределяет его. EDIT : И (после просмотра) он обеспечивает неабстрактную, явную реализацию как IDisposable.Dispose.

...