Как добраться, родительский базовый класс возражают super.getClass ()

У меня есть немного проблемы с Java (являющийся программистом на C++).

У меня есть 2 связанных класса:

public class Patient() {
...
}

public class PatientPersistent extends Patient {
...
    public void foo() {
    System.out.println(super.getClass().toString());
    }
}

Это произведет:

класс org.example.smartgwt.server.model. PatientPersistent

Существует ли способ получить тип родительского класса? т.е.

класс org.example.smartgwt.server.model. Пациент.

Это позволит мне обобщать некоторые методы, которые я должен реализовать в каждом ребенке, который ужасен.

Спасибо!


ОБНОВЛЕНИЕ

Я использую Dozer для преобразования моего объекта домена Hibernate в сериализуемую версию. Я не хочу, чтобы клиент знал об этом, таким образом, клиент только видит Терпеливый класс. На стороне сервера я выполняю преобразования.

public class DataObject<Type> {

    private static final Class<Object> DstType = Type;

    public Object convert(Object srcData, final BeanFactory factory) {
        Mapper mapper = (Mapper)factory.getBean("dozerMapper");

        return (Object)mapper.map(srcData, DstType);
    }
}

public class Patient() implements Serializable {
    public Set foo;
}    

public class PatientPersistent extends Patient {

    public org.hibernate.collection.PersistentSet foo;
    DataObject<Patient> converter = new DataObject<Patient>;

    public Patient convertToSerializable(final BeanFactory factory) {
        return (Patient)converter.convert(this, factory);
    }
}

public class main() {
    // This object is not serializable so I cannot send it to the client
    PatientPersistent serializableBar = new PatientPersistent();

    // Using Dozer to copy the data PatientPersistent -> Patient
    // This will load the Dozer spring bean and copy as mapped
    Patient copiedSerializableData = serializableBar.convertToPersistent(bar, factory);
}

Я знаю, что этот код не работает, но он должен только высказать мое мнение. Я хотел бы смочь преобразовать объект в, он - сериализуемая форма так, чтобы я мог передать его обратно клиенту. Вот почему я хотел бы дать тип родителя. Вызов картопостроителя всегда будет тем же самым, исходным объектом и Dest.class.

Возможно, я просто слишком перепутан с Java.

Спасибо

17
задан code-gijoe 21 July 2010 в 14:08
поделиться

5 ответов

getClass().getSuperclass()

Но не используйте это. Это, безусловно, признак плохого дизайна.

33
ответ дан 30 November 2019 в 10:39
поделиться

Object.getClass () возвращает объект типа времени выполнения , поэтому добавление super к вызову на самом деле мало что дает .

Вы можете использовать getClass (). GetSuperclass () .

7
ответ дан 30 November 2019 в 10:39
поделиться

Отлично ... super.getClass () на самом деле является getClass () объекта, который возвращает тип среды выполнения экземпляра, для которого он был вызван (в данном случае this ). Следовательно, вы получаете тот же класс ...

Вместо того, чтобы запрашивать класс среды выполнения this с использованием реализации super, вы должны запросить суперкласс класса, возвращенного getClass:

getClass().getSuperclass()

И Кстати, что вы имеете в виду, говоря «Это позволит мне обобщить некоторые методы, которые мне нужно реализовать в каждом дочернем элементе, что ужасно»? Вы уверены, что у вас нет другого выбора дизайна?

8
ответ дан 30 November 2019 в 10:39
поделиться

Попытка: getClass().getSuperclass().toString()

2
ответ дан 30 November 2019 в 10:39
поделиться

Я нахожу много времени, что решение проблемы с помощью «магии» тем способом, который вы предлагаете, приводит к не очень гибкому решению.

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

Кроме того, есть большая вероятность, что дизайн был бы еще лучше, если бы метод, который вы в настоящее время реализовали, действительно находился в вашем родительском классе, и этот метод ссылался на абстрактный метод, реализованный в дочернем классе - перевернув ваш дизайн на его голова.

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

1
ответ дан 30 November 2019 в 10:39
поделиться
Другие вопросы по тегам:

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