2012-05-15 3 views
0

Это относится к языку Java.Может ли метод узнать тип объекта, который его вызывает (т. Е. Подтип, который его вызывает)

Предположим, у нас есть суперкласс A и подклассы X и Y. У меня есть метод в A, который должен знать тип X и Y (это внешняя библиотека).

У меня есть метод на A, называемый someMethod(). Мой вопрос: в реализации someMethod() есть способ узнать, называется ли он X или Y?

Пожалуйста, дайте мне знать, если это неясно.

EDIT^2:

Конкретная ситуация в классе А выглядит следующим образом.

public void delete() { 
    Datastore ds = Dao.instance().getDatabase(); 
    ds.delete(this.getClass(),this.id); 
} 

, и я хотел бы быть в состоянии сделать X.delete() и Y.delete()

+1

Зачем вам нужно знать тип? Если поведение отличается, тогда пишите разные реализации '' someMethod() '' в '' X'' и '' Y''. –

+0

Я использую библиотеку Morphia с Mongodb. Он должен знать тип класса, чтобы он мог получить правильные данные. Однако в идеале я хотел бы иметь суперкласс, называемый Model, который имеет метод read(), чтобы затем я мог вызвать MyObject.read(), и он читается. Но я сделал то, что вы предлагаете. – Ankur

+0

Нет, и это не должно. Это называется «государственная ориентация», и это считается крайне плохой проектной практикой. Если вы хотите, чтобы метод делал что-то другое, передайте другой параметр или напишите другой метод. – EJP

ответ

3

Вы можете легко выяснить, является ли метод называется на Х или Y, используя getClass():

public void someMethod() { 
    System.out.println(getClass()); // Will display the execution-time type 
} 

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

+0

+1 для идеального объяснения. – noMAD

+0

Спасибо, Джон. Мое решение - делать «что-то опасное» и переписывать CRUD-методы для 12 разных объектов. Поскольку я единственный, кто использует этот код (и это персональный проект), я пойду с уменьшением кода. Еще раз спасибо. – Ankur

3

Да: просто позвонить getClass(). Например:

class A { 
    public void someMethod() { 
    System.out.println(getClass().getSimpleName()); 
    } 
} 

Это распечатать либо X или Y в зависимости от класса исполнения объекта, на котором она вызывается.