Я работаю над проектом с открытым исходным кодом, который в основном переводит большую библиотеку C++ на Java. Объектная модель исходного существа на C++ иногда может быть довольно сложной. Более того, я бы сказал ... что было более или менее девизом дизайнеров Java ... ну ... это еще одна тема.
Дело в том, что я написал статью, в которой показано, как вы можете обойти стирание стилей в Java. В статье хорошо объясняется, как это можно сделать, и в конце концов, как ваш исходный код может в конце концов очень похож на C++.
http://www.jquantlib.org/index.php/Using_TypeTokens_to_retrieve_generic_parameters
Непосредственное следствие этого исследования я сделал то, что можно было бы реализовать виртуальные классы базовых в приложении, я имею в виду: не в Java, а не на языке, но в вашем приложении , через некоторые трюки или много трюков, чтобы быть более точными.
В случае, если у вас есть интерес к такому черному волшебству, приведенные ниже строки могут быть полезны для вас как-то. В противном случае, конечно, нет.
Хорошо. Вперед.
В Java существует несколько трудностей: 1. Тип стирания (решена в статье) 2. javac не был предназначен для понимания того, что такое виртуальный базовый класс; 3. Даже используя трюки, вы не сможете обойти трудность №2, потому что эта сложность появляется во время компиляции.
Если вы хотите использовать виртуальные базовые классы, вы можете получить его с помощью Scala, который в основном решил трудность №2, точно создав другой компилятор, который, я бы сказал, полностью понимает некоторые более сложные объектные модели.
, если вы хотите, чтобы изучить мою статью и попытаться «circunvent» виртуальных базовых классов в чистом Java (не Scala), вы могли бы сделать что-то, как я объясню ниже:
Предположим, что у вас есть что-то вроде этого в C++:
template<Base>
public class Extended : Base { ... }
это может быть перевести на что-то вроде этого в Java:
public interface Virtual<T> { ... }
public class Extended<B> implements Virtual<B> { ... }
OK. Что происходит, когда вы создаете экземпляр Extended, как показано ниже?
Extended extended = new Extended<Base>() { /* required anonymous block here */ }
Ну .. в основном вы будете в состоянии избавиться от типа стирания и будет иметь возможность получить информацию о типе базы внутри вашего класса Extended. См. Мою статью для подробного объяснения черной магии.
OK. Когда у вас есть тип Base in Extended, вы можете создать конкретную реализацию Virtual.
Обратите внимание, что во время компиляции, Javac может проверить типы для вас, как в примере ниже:
public interface Virtual<Base> {
public List<Base> getList();
}
public class Extended<Base> implements Virtual<Base> {
@Override
public List<Base> getList() {
// TODO Auto-generated method stub
return null;
}
}
... Ну, несмотря на все усилия, чтобы осуществить это, в конце концов, мы делаем плохо, что отличный компилятор, такой как scalac, намного лучше нас, в частности, он выполняет свою работу во время компиляции.
Надеюсь, это поможет ... если не смутить вас!
Что вы подразумеваете под «виртуальным базовым классом» в C++? Класс, который имеет хотя бы одну чистую виртуальную функцию (например, virtual void booga() = 0;)? – FireAphis
@FireAphis: http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=/com.ibm.vacpp7a.doc/language/ref/clrc14cplr135.htm – SlowAndSteady
Базовый класс с по крайней мере одна виртуальная функция (не обязательно чистая виртуальная функция) является виртуальным базовым классом. Базовый класс с хотя бы одной чистой виртуальной функцией называется абстрактным базовым классом. –