Member 13354128 Ответов: 3

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


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

вот что я хочу сделать IDataService id = new IDataService() возможно ли это или есть обходной путь?

public interface IDataService
{
    method a
    method b
    method c
    method etc
}

internal sealed class DataService : IDataService
{
    method a
    method b
    method c
    method etc
}

спасибо

Что я уже пробовал:

Единственное, что я пробовал, это изменить класс на public, но это не вариант для меня

3 Ответов

Рейтинг:
2

Kornfeld Eliyahu Peter

Нет никакого способа создать объект из интерфейса!
Я не уверен, что вы подразумеваете под тем, что не раскрываете класс, но ваш единственный вариант-это:

IDataService id = new DataService()


Рейтинг:
2

cvogt61457

Вы не можете создать экземпляр интерфейса.
Вы определяете класс, который реализует интерфейс. Затем создайте экземпляр этого класса.

// This works
IDataService myService = new DataService();


Member 13354128

Спасибо за ввод, и это работает до тех пор, пока я делаю DataService общедоступным, но мне нужно, чтобы он оставался внутренним, чтобы разработчики не могли получить доступ к внутренним классам и попытаться изменить их, расширяя их или выводя из них. Есть ли обходной путь/задняя дверь?

Это-- & gt; внутренний запечатанный класс DataService : IDataService
Не это-- & gt; public sealed class DataService : IDataService

cvogt61457

Внутреннее доступно в сборке. Его не видно за пределами сборки.
Вам нужно будет предоставить класс (фабрику) внутри сборки, который даст вам IDataService для использования вне сборки.

Ассамблеи1
публичный интерфейс IDataService
{
}
внутренний запечатанный класс DataService : IDataService
{
}

Ассамблеи2
// Не будет работать - DataService является внутренним
DataService dataService = новый DataService();

// Будет работать
IDataService dataService = factory. GetService();

Kornfeld Eliyahu Peter

В тот момент, когда ваш класс запечатан, никакой другой класс не может наследовать от него, public не имеет к этому никакого отношения...
Если вы хотите помешать другим увидеть ваш код - сделайте некоторую путаницу...

Рейтинг:
0

Richard MacCutchan

Вы должны следовать правилам: Интерфейсы (Руководство По Программированию На C#) | Microsoft Docs[^],
Особенно:

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