2015-03-27 4 views
0

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

Например:

abstract class base 
{ 
     public void doSomething(Child1 or Child2){ 
     } 
} 
class Child1 extends base 
{ 
    public void somefunc(){ 
     doSomething(Child1); 
    } 
} 
class Child2 extends base 
{ 
    public void somefunc(){ 
     doSomething(Child2); 
    } 
} 

Я чувствую, что есть несколько способов обойти это. Можно ли получить представление о возможных путях? Я определенно не хочу создавать одну и ту же функцию во всех дочерних классах.

ответ

0

Похоже, это то, что вы ищете.

abstract class base 
{ 
     public void doSomething(base obj){ 
     } 
} 
class Child1 extends base 
{ 
    public void somefunc(){ 
     doSomething(this); 
    } 
} 
class Child2 extends base 
{ 
    public void somefunc(){ 
     doSomething(this); 
    } 
} 

Затем, если вы хотите переопределить doSomething в своих дочерних классах. На самом деле вам даже не нужен параметр base и передать this, у вас уже есть неявная ссылка на this.

0

Одной из идей, лежащих в основе наследования, является разделение поведения между классами одного и того же абстрактного типа.

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

Если вы хотите по-разному поведения в своих подклассах, объявите абстрактный тег метода в своем базовом классе и реализуйте каждое из поведений в разных подклассах.

2

Я не уверен, что параметр, переданный doSomething, должен быть this или отдельным объектом того же типа. В первом случае ответ peter.petrov - это то, что вы хотите. Во втором случае стандартный способ заключается в том, чтобы сделать Base общий и использовать рекурсивную привязку.

abstract class Base<T extends Base<T>> { 

    public void doSomething(T t) {} 
} 

class Child1 extends Base<Child1> { 

    public void someFunc() { 
     Child1 child1 = new Child1(); 
     doSomething(child1); 
    } 
} 

class Child2 extends Base<Child2> { 

    public void someFunc() { 
     Child2 child2 = new Child2(); 
     doSomething(child2); 
    } 
} 
+1

хотя @ peter.petrov, вероятно, решит мою проблему ... мне нравится ваш ответ на это также. – user1647708

Смежные вопросы