Интерфейсы С# - использовать интерфейс только в других интерфейсах

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

Спасибо заранее!

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

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

    class SomeAnim : Animated
    {
        public new void Foo() { }
    }
    
  • Используйте mixins. Храните 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
        }
    }
    

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

Ответ 3

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