Частично скрыть методы интерфейса для внешних сборок - PullRequest
1 голос
/ 11 октября 2011

Я ищу способы «опубликовать» метод в одном интерфейсе для другого интерфейса, но скрыть его для других.

У меня есть следующие интерфейсы

public interface IFirst
{
  void Forbidden();
}

public interface ISecond
{
  void Test(IFirst first);
}

internal class Second : ISecond 
{
  void Test(IFirst first)
  {
    first.Forbidden();
  }
}

Как вы можете видеть, реализации ISecond должны вызывать метод 'Forbidden' в IFirst. Однако я не хочу, чтобы классы в другой сборке вызывали 'Forbidden' в реализациях IFirst. Что я могу сделать, чтобы скрыть этот метод от внешнего мира, но при этом позволить реализациям ISecond использовать его?

Ответы [ 3 ]

3 голосов
/ 11 октября 2011

Поместите метод Forbidden в другой, не публичный интерфейс:

public interface IFirst
{
  // whatever ...
}

internal interface IPrivate : IFirst
{
    void Forbidden();
}

public interface ISecond
{
  void Test(IFirst first);
}

internal class Second : ISecond 
{
  void Test(IFirst first)
  {
    var priv = first as IPrivate;
    if (priv != null)
        priv.Forbidden();
  }
}
1 голос
/ 11 октября 2011

взгляните на внутреннее ключевое слово и атрибут * internalsvisibleto . вместе с тем вы должны быть в состоянии делать то, что вы хотите. Обратите внимание: это относится к всем внутренним элементам вашей сборки.

0 голосов
/ 11 октября 2011

Я не думаю, что с этим можно что-либо сделать, если вы хотите взаимодействовать, например, если вы хотите, чтобы публичный метод ISecond принял параметр IFirst, тогда IFirst должен быть публичным и т. Д.должны все свои методы, чтобы пользователи IFirst всегда могли вызывать методы.

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

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

public abstract class FirstBase
{
   protected internal abstract void Forbidden();
}

public interface ISecond
{
  void Test(FirstBase first);
}

internal class Second : ISecond 
{
  void Test(FirstBase first)
  {
    first.Forbidden();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...