родительский класс для возврата подкласса - PullRequest
1 голос
/ 22 сентября 2011

Трудно объяснить словом, что я ищу, но, надеюсь, приведенного ниже примера кода с комментариями будет достаточно. По сути, я хочу, чтобы строка SubClass sc = new Subclass().method1() возвращала экземпляр подкласса.

public class SuperClass {

    public SuperClass method1()
    {
       //do whatever
       return this
    }
}

public class SubClass extends SuperClass {

    //we inherit method 1

    //method2
    public SubClass method2()
    {
       //do whatever
       return this
    }
}

//succesfully returns instance of Sublass, but...
SubClass sc = new Subclass().method2() 

//...the following line returns an instance of SuperClass and not Sublass
//I want Sublass's instance, without having to using overides
//Is this possible?

SubClass sc = new Subclass().method1()

РЕДАКТИРОВАТЬ: ---------------------------- сценарий использования ------------ -------------------

Message myMessage =  new ReverseTransactionMessageBuilder()
                    .policyNo(POLICY_NO) //on ReverseTransactionMessageBuilder
                    .audUserId(AUD_USER_ID) //on inherited MessageBuilder
                    .audDate(new Date()) //on inherited MessageBuilder
                    .processNo(EProcessConstants.FINANCE_MANUAL_ADJUSTMENT.getProcessCd()) //on inherited MessageBuilder
                    .serviceName("finance.ProcessReversalCmd") //on inherited MessageBuilder
                    .create(); //create is overridden so this is ReverseTransactionMessageBuilder

Первое, что вы заметите, это то, что способ sbrattla позволяет мне вызывать эти методы .audDate () .xxx () в любом порядке. С помощью приведенной выше конструкции класса вы вынуждены вызывать метод в последнем подклассе (или использовать действительно уродливое приведение)

Ответы [ 2 ]

7 голосов
/ 22 сентября 2011

Вам нужно сделать что-то вроде:

public class SuperClass<T> {

  public T method1() {
    return (T) this;
  }

}

public class SubClass extends SuperClass<SubClass> {

  public SubClass method2() {
    return (SubClass) this;
  }

}

Вы можете узнать больше о Java Generics в " Generics Введение ", но кратко объяснили, что вы говорите SuperClass привести приведенный экземпляр к T, который представляет определенный вами тип. В данном случае это подкласс.

0 голосов
/ 09 марта 2018

Я думаю, что вы можете использовать универсальный метод, подобный следующему:

class Parent {
  public <T extends Parent> T instance() {
    return (T) this;
  }
}

class Child extends Parent {
}

class Test {
  public static void main() {
    Child child = new Parent().instance();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...