Возврат вводит подобный языкам C полиморфизм

Сбой происходит в JDBCStoreManager в методе setInverseRelation в следующем коде:

               ClassMapping cm =
                    (ClassMapping) _conf.getMetaDataRepositoryInstance().getCachedMetaData(pc.getClass());
                FieldMapping[] fmd = cm.getFieldMappings();

cm имеет значение null и поэтому cm.getFieldMappings () аварийно завершает работу. ClassMapping отсутствует в кэше метаданных. По какой-то причине кеш имеет только оригинальные классы, но pc.getClass возвращает класс ENHANCED. Очень похоже на ошибку в Open JPA. Кто-нибудь может это подтвердить?

11
задан πάντα ῥεῖ 4 August 2015 в 16:50
поделиться

5 ответов

Если "возвратом вводят полиморфизм", Вы означаете перегружаться на основе типа возвращаемого значения, я не уверен в других языках, но для C++ вот ответ (в значительной степени из первых уст):

Функциональные типы возврата не играют роли в разрешении перегрузки просто, потому что Stroustrup (я принимаю с входом от других архитекторов C++), требуемое разрешение перегрузки, чтобы быть 'независимым контекстом'. См. 7.4.1 - "Перегрузка и Тип Возврата" с "Языка Программирования на C++, Третий Выпуск".

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

Они хотели, чтобы это базировалось только о том, как перегрузку назвали - не, как результат использовался (если это использовалось вообще). Действительно, много функций вызваны, не используя результат, или результат использовался бы в качестве части большего выражения. Один фактор, что я уверен, сыграл роль, когда они решили, что это было то, что, если бы тип возврата был частью разрешения, было бы много вызовов к перегруженным функциям, которые должны были бы быть разрешены со сложными правилами или должны будут иметь бросок компилятора ошибка, что вызов был неоднозначен.

И, Господь знает, разрешение перегрузки C++ достаточно сложно как есть...

16
ответ дан 3 December 2019 в 04:15
поделиться

я хотел бы видеть эту функцию на некотором языке, не только так, чтобы функциональное нечто могло возвратить двойное или интервал или строку, но также и так, чтобы нечто могло возвратить структуру или объекты различных классов. Устранение неоднозначности вызовов было бы довольно тривиально - если вызов неоднозначен, потребуйте, чтобы бросок выбрал желаемый тип возврата. Пример:

string s = foo();    //foo returns a string
double x = foo();    //foo returns a double
int i = foo();       //foo returns an integer
float f = (float)(int)foo();    //call the int foo and convert to float

кроме того,

Animal a = fooFactory();    //fooFactory returns an Animal
Plant p = fooFactory();     //foofactory returns a Plant

эти ситуации не подходят очень часто, но когда они делают обходное решение часто довольно ужасно...

4
ответ дан 3 December 2019 в 04:15
поделиться
double x = (double)foo();

Вышеупомянутое неоднозначно, если существуют версии нечто (), который может возвратиться дважды, интервал, плавание, и т.д.

3
ответ дан 3 December 2019 в 04:15
поделиться

В C++ можно сделать это с классами в большой степени. Например, скажите, что у меня есть тип данных, который обычно преобразовывается в ASCII на вводе и выводе;

typedef char* pchar;

class   MyType
{
public:

 operator pchar() { return(ConvertToASCII()); }
 MyType& operator=(char* input) { ConvertFromASCII(input); return(*this); }

 pchar ConvertToASCII();
 void ConvertFromASCII(pchar ASCII);
}

Этот тип вещи часто используется в платформах C++. Например, взгляните на implmentation класса CString MFC. По моему скромному мнению, это - очень полезный инструмент, хотя опасный при определенных обстоятельствах.

2
ответ дан 3 December 2019 в 04:15
поделиться

Из-за автопреобразования типов не очевидно знать, какую функцию вызвать, когда типы возврата близки.

0
ответ дан 3 December 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: