Интерфейсы С# - использовать интерфейс только в других интерфейсах
Я хотел бы реализовать только определенные интерфейсы в других интерфейсах, я не хочу, чтобы они могли быть унаследованы непосредственно классом.
Спасибо заранее!
Ответы
Ответ 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
.