Интерфейсы C # - реализуют интерфейс только в других интерфейсах - PullRequest
15 голосов
/ 17 февраля 2010

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

Заранее спасибо!

Ответы [ 3 ]

26 голосов
/ 17 февраля 2010

Вы не можете сделать это в C # - любой класс может реализовать любой интерфейс, к которому у него есть доступ.

Зачем тебе это делать? Имейте в виду, что путем объявления наследования интерфейса:

public interface InterfaceA {}
public interface InterfaceB : InterfaceA {}

Вы указываете, что все, что реализует InterfaceB, также должно реализовывать InterfaceA, поэтому вы все равно получите классы, реализующие InterfaceA.

1 голос
/ 17 февраля 2010

Прежде всего, не имеет смысла говорить «реализовать в других интерфейсах», потому что интерфейсы не могут ничего реализовать.

Я вижу два некорректных способа сделать это, вроде.

  1. Создание анимированных и неанимированных абстрактных классов, которые реализуют IAnimation. Конкретный класс под ними все еще может принудительно переопределить ваши методы IAnimation с помощью нового оператора:

    class SomeAnim : Animated
    {
        public new void Foo() { }
    }
    
  2. Используйте миксин. Сохраняйте IAnimated и INonAnimated в качестве интерфейсов, но не добавляйте никаких методов в ваш интерфейс. Вместо этого определите методы расширения следующим образом:

    static class Ext
    {
        public static void Foo(this IAnim anim)
        {
            if (anim is IAnimated) // do something
            else if (anim is INonAnimated) // do something else
        }
    }
    

снова, немного взломать. Но то, что вы пытаетесь сделать, в любом случае указывает на недостатки дизайна.

0 голосов
/ 17 февраля 2010

Лучшее, что я могу предложить, - это поместить их - и верхний уровень, и нисходящие интерфейсы в отдельную сборку с интерфейсами базового уровня, объявленными как internal, и интерфейсами, расширяющими эти интерфейсы как * 1002.*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...