Да, z
реализует как x
, так и y
. Вы можете доказать это, используя объявление переменной для назначения конкретного типа типу интерфейса:
var _ x = z{}
var _ y = z{}
Это дает вам проверку времени компиляции, чтобы убедиться, что тип реализует интерфейсы, которые вы хотите.
В качестве примечания: если вы явно хотите, чтобы y
было x + some more methods
, то имеет смысл написать это так:
interface y {
x
b()
}
Что касается именования, если тип реализует два разных интерфейса, которые совместно используют некоторые методы, я бы назвал это просто - тип, который реализует два разных интерфейса. Один интерфейс, являющийся подмножеством другого, не имеет значения.
Более того, в Go типы (также неструктурные) не связаны с интерфейсами, когда они определены. Даже если тип не был написан для реализации какого-либо интерфейса, вы можете сделать , чтобы он реализовал любое количество интерфейсов, определяя новые интерфейсы с другими именами и / или различными комбинациями методов из типа. Это делает придание имени концепции еще сложнее - как вы узнаете имя во время определения типа, когда интерфейсы могут быть определены позже в другом пакете?