У меня есть общий интерфейс, который имеет метод с другим общим типом. Ограничение метода должно допускать только типы, которые являются производными от общего типа класса. Я попытался следующий код и некоторые другие возможности, но никто не работал до сих пор:Общий метод с общим типом типа класса
generic <class ObjectType>
public interface class IFoo
{
public:
generic <class ObjectTypeInherited> where ObjectTypeInherited : ObjectType
ObjectTypeInherited Test();
};
public ref class Derived : IFoo<System::Object^>
{
public:
generic <class ObjectTypeInherited> where ObjectTypeInherited : System::Object^
virtual ObjectTypeInherited Test()
{
return ObjectTypeInherited();
}
};
int main(array<System::String ^> ^args)
{
auto derived = gcnew Derived();
auto nullString = derived->Test<System::String^>();
if (nullString == nullptr)
System::Console::WriteLine("Got a null string!");
return 0;
}
Я получаю следующее сообщение об ошибке с моим кодом:
error C3766: 'Derived' must provide an implementation for the interface
метод «ObjectTypeInherited IFoo :: Test (аннулируются)»
Если я изменить его на:
generic <class ObjectTypeInherited> where ObjectTypeInherited : System::Object^
я получаю другую ошибку:
error C3284: the constraints for generic parameter 'ObjectTypeInherited' of function 'ObjectTypeInherited Derived::Test(void)' must match the constraints for generic parameter 'ObjectTypeInherited' of function 'ObjectTypeInherited IFoo<System::Object ^>::Test(void)'
Кто-нибудь знает, как правильно реализовать это?
Edit: System :: Object^ и System :: String^ классы используются только в качестве примера. Обычно я использую 2 собственные классы реф как MyObject и MyDerivedObject: MyObject
Незначительное исправление: Ваш пункт, где для 'метода Derived' должен быть' где ObjectTypeInherited: System :: Object', без '' ^, но по-прежнему дает те же «ограничения должны соответствовать» ошибка. Я не знаю, почему эта ошибка все еще существует. –