You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Перенос предложения: голоса +1, -5 Автор идеи:Виталий Псевдокенко
Интерфейсы в общем нужны для избежания ошибок при написания самого тела класса(то есть как можно раньше, а не при передаче объекта как аргумента функции или вообще багов на рантайме в случае использование множественного наследования), а также для подсказок IDE и автогенерации кода. Виртуальные интерфейсы для избежания проблем с множественным наследованием. Невиртуальные интерфейсы наподобие концептов в с++20, а также как их дополнение.
1 Интерфейсы в целом.
1.1 Для объявления интерфейса используется контекстное слово “interface” вместе с ключевым словом “class”
classinterface MyInterface{
// ***
};
1.2 Объявления реализации интерфейса осуществляется так же как и при наследовании класса от другого класса, только без указания модификатора доступа наследования.
1.3 При реализации интерфейса запрещается множественное наследование от классов(целесообразность этого пункта под вопросом)
1.4 Интерфейс может использоваться так же как и концепт (под капотом компилятор создаёт концепт без имени с проверкой std::is_base_of):
template<MyInterface T>
voidfunc(T x);
1.5 Уточнения std::is_base_of для интерфейсов, и/или добавление отдельного библиотечного класса для такой проверки.
1.6 Методы с реализацией по умолчанию:
classinterface MyInterface{
// Метод без реализацииvoidtest();
// Метод с реализацией по умолчанию вне тела класа или с реализацией компилятора(к // примеру операторы сравнения начиная с c++20voidtest2() = default;
// Метод с реализацией по умолчанию внутри класаvoidtest3() = default {
// ...
}
};
1.7 Для всех модификаторов доступа разрешены пользовательские типы и статические члены.
1.8 Для модификатора доступа “protected” разрешены также методы с реализацией по умолчанию.
1.9 Для модификатора доступа “public” разрешены также методы с и без реализации.
1.10 Для модификатора доступа “private” разрешено все то же что и в обычном классе, а также приватный конструктор по умолчанию, который всегда вызывается только конструкторами реализующих классов или в интерфейсах, которые расширяют интерфейс.
1.11 Члены с модификатором “private” используются методами с реализацией по умолчанию.
1.12 Для переопределения метода при колизии используется ключевое слово “using”:
classinterface MyInterfaceA{
inttest(int a, int b) = default{
return a + b;
}
};
classinterface MyInterfaceB {
inttest(int a, int b) = default{
return a + b;
}
};
classinterface MyInterfaceC: MyInterfaceA, MyInterfaceB {
usingintMyInterfaceB::test(int a, int b);
};
classMyClass: MyInterfaceA, MyInterfaceB {
usingintMyInterfaceA::test(int a, int b);
};
1.13 Модификатор доступа по умолчанию - “public” .
1.14 Определения виртуального или невиртульного метода:
classinterface MyInterfaceA{
voidtest1();
virtualvoidtest2();
};
classinterface MyInterfaceB: MyInterfaceA{
voidtest1() = default{
// ...
}
virtualvoidtest2();
};
classMyClassB: MyInterfaceB{
};
classinterface MyInterfaceC: MyInterfaceB{
virtualvoidtest2() = default{
// ...
}
};
classMyClassC: MyInterfaceC{
};
intmain(){
MyInterfaceA * ptr; // ОШИБКА: у интерфейса есть нереализованые невиртуальные методы
MyInterfaceB * ptr; // ОК
MyClassB obj; // ОШИБКА: у интерфейса есть нереализованые виртуальные методы
MyClassC obj; // ОК
}
2 Невиртуальные методы интерфейса
2.1 Разрешается использования “override”, “final”, “= 0” для невиртуальных методов интерфейса для проверки в классе реализации метода:
2.2 Специальная конструкция для определения типа класса, который реализуюет невиртуальный метод (определяется при каждой реализации, так как невиртуальный метод недоступен по ссылке или указателю интерфейса или класса, который не реализует метод); (используется как синтаксический сахар над CRTP, и в случае переопределения метода):
classinterface MyInterface{
autotest(); // auto - может содержать тип класса, который реализует интерфейс
}
classMyClass1: MyInterface{
MyClass1 test() override{//...} //ОКinttest() override{//...} //ОШИБКА
}
classMyClass2: publicMyClass1{
MyClass2 test() override{//...} //ОК
}
The text was updated successfully, but these errors were encountered:
Перенос предложения: голоса +1, -5
Автор идеи: Виталий Псевдокенко
Интерфейсы в общем нужны для избежания ошибок при написания самого тела класса(то есть как можно раньше, а не при передаче объекта как аргумента функции или вообще багов на рантайме в случае использование множественного наследования), а также для подсказок IDE и автогенерации кода. Виртуальные интерфейсы для избежания проблем с множественным наследованием. Невиртуальные интерфейсы наподобие концептов в с++20, а также как их дополнение.
1 Интерфейсы в целом.
1.1 Для объявления интерфейса используется контекстное слово “interface” вместе с ключевым словом “class”
1.2 Объявления реализации интерфейса осуществляется так же как и при наследовании класса от другого класса, только без указания модификатора доступа наследования.
1.3 При реализации интерфейса запрещается множественное наследование от классов(целесообразность этого пункта под вопросом)
1.4 Интерфейс может использоваться так же как и концепт (под капотом компилятор создаёт концепт без имени с проверкой std::is_base_of):
1.5 Уточнения std::is_base_of для интерфейсов, и/или добавление отдельного библиотечного класса для такой проверки.
1.6 Методы с реализацией по умолчанию:
1.7 Для всех модификаторов доступа разрешены пользовательские типы и статические члены.
1.8 Для модификатора доступа “protected” разрешены также методы с реализацией по умолчанию.
1.9 Для модификатора доступа “public” разрешены также методы с и без реализации.
1.10 Для модификатора доступа “private” разрешено все то же что и в обычном классе, а также приватный конструктор по умолчанию, который всегда вызывается только конструкторами реализующих классов или в интерфейсах, которые расширяют интерфейс.
1.11 Члены с модификатором “private” используются методами с реализацией по умолчанию.
1.12 Для переопределения метода при колизии используется ключевое слово “using”:
1.13 Модификатор доступа по умолчанию - “public” .
1.14 Определения виртуального или невиртульного метода:
2 Невиртуальные методы интерфейса
2.1 Разрешается использования “override”, “final”, “= 0” для невиртуальных методов интерфейса для проверки в классе реализации метода:
2.2 Специальная конструкция для определения типа класса, который реализуюет невиртуальный метод (определяется при каждой реализации, так как невиртуальный метод недоступен по ссылке или указателю интерфейса или класса, который не реализует метод); (используется как синтаксический сахар над CRTP, и в случае переопределения метода):
The text was updated successfully, but these errors were encountered: