import java.lang.Math; // headers MUST be above the first class
// one class needs to have a main() method
public class HelloWorld
{
// arguments are passed using the text field below this editor
public static void main(String[] args)
{
Child myObject = new Child();
myObject
.BaseMethod()
.ChildMethod();
}
}
public class Base<T>
{
@SuppressWarnings("unchecked")
public T BaseMethod()
{
System.out.print("I Am Parren\n");
return (T)this;
}
}
public class Child extends Base<Child>
{
public Child ChildMethod()
{
System.out.print("I Am Child\n");
return this;
}
}
Так будет работать, да. Я просто брал в расчёт что неизвестно сколько уровней наследования будет в будущем. С третим слоем как будете справляться? Переписывать родителя при появлении потомка. Как-то неправильно, как мне кажется.
public class HelloWord {
public static void main(String[] args)
{
Child<Child> myObject = new Child();
myObject
.BaseMethod()
.ChildMethod();
Child2 myObject2 = new Child2();
myObject2
.BaseMethod()
.ChildMethod()
.ChildMethod2();
}
public static class Base<T>
{
public T BaseMethod()
{
System.out.print("I Am Parent\n");
return (T)this;
}
}
public static class Child<T> extends Base<T>
{
public T ChildMethod()
{
System.out.print("I Am Child\n");
return (T) this;
}
}
public static class Child2 extends Child<Child2>
{
public Child2 ChildMethod2()
{
System.out.print("I Am Child2\n");
return this;
}
}
Это вложенные классы.
Вот пример ближе к вашему, но с правильным пакетным доступом. В Java в одном файле может быть только один публичный невложенный класс:
public class HelloWord {
public static void main(String[] args) {
Child<Child> myObject = new Child();
myObject
.BaseMethod()
.ChildMethod();
Child2 myObject2 = new Child2();
myObject2
.BaseMethod()
.ChildMethod()
.ChildMethod2();
}
}
class Base<T> {
public T BaseMethod() {
System.out.print("I Am Parent\n");
return (T) this;
}
}
class Child<T> extends Base<T> {
public T ChildMethod() {
System.out.print("I Am Child\n");
return (T) this;
}
}
class Child2 extends Child<Child2> {
public Child2 ChildMethod2() {
System.out.print("I Am Child2\n");
return this;
}
}
Сделал немного костыльное решение, но зато оно будет точно работать и расширяемо. При этом не будет задевать родительские классы:
public class HelloWord {
public static void main(String[] args) {
Child<Child> myObject = new Child();
myObject
.BaseMethod()
.ChildMethod();
Child2<Child2> myObject2 = new Child2();
myObject2
.BaseMethod()
.ChildMethod()
.ChildMethod2();
Child3<Child3> myObject3 = new Child3<>();
myObject3
.BaseMethod()
.ChildMethod()
.ChildMethod2()
.ChildMethod3();
}
}
class Base<T extends Base> {
public T BaseMethod() {
System.out.print("I Am Parent\n");
return (T) this;
}
}
class Child<T extends Child> extends Base<T> {
public T ChildMethod() {
System.out.print("I Am Child\n");
return (T) this;
}
}
class Child2<T extends Child2> extends Child<T> {
public T ChildMethod2() {
System.out.print("I Am Child2\n");
return (T) this;
}
@Override
public T ChildMethod() {
return super.ChildMethod();
}
}
class Child3<T extends Child3> extends Child2<T> {
public T ChildMethod3() {
System.out.print("I Am Child3\n");
return (T) this;
}
@Override
public T ChildMethod2() {
return super.ChildMethod2();
}
@Override
public T ChildMethod() {
return super.ChildMethod();
}
}
У вас в реальных тестах не будет такого варианта, чтобы добавлять снизу, так как вы сразу проектируете страницу наследуя от базовых(их может быть сколько угодно) и добавляя общие блоки композицией. Даже если и будет, то это очень уникальный случай, сомневаюсь что под под очень маловероятный случай нужно подгонять весь код.