Перегрузка методов с использованием объектов производного класса, на которые ссылается базовый класс - java - PullRequest
0 голосов
/ 15 сентября 2011
class base{}

class childA extends base{}

class childB extends base{}

У меня есть две функции (перегружены) как это:

function(childA,childA){}

function(childA,childB){}

// основная программа

base a = new childA();
base b = new childB();

function(a,b);   
function(a,a);  //problem

Вызовы функций не будут компилироваться явно.

Но есть ли способ получить тот же эффект без чрезмерного усложнения кода или проверки типов при каждом вызове функций.

Примечание: перегруженные функции не зависят от классов. Классы - это просто структуры данных, я бы предпочел, чтобы в них не было никакого взаимозависимого кода.

PS. Я пролистал немало тем, посвященных схожим проблемам, но, похоже, они не касаются проблем, упомянутых выше. Извините, если я что-то пропустил (новичок, первый пост и т. Д.)).

Редактировать:

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

Хорошо, другой пример, это почти то, что я пытаюсь сделать.

class Shape{}

class Rectangle extends Shape{
//rectangle data
}

class Circle extends Shape{
//circle data
}

перегруженные функции (члены другого класса)

boolean checkIntersection(Rectangle r, Circle c){}
boolean checkIntersection(Circle c, Circle c){}

// основная программа

Vector<Shape> shapes = new Vector<Shape>();
shapes.add(new Rectangle());
shapes.add(new Circle());
shapes.add(new Circle());

checkIntersection(shapes.get(0),shapes.get(1));
checkIntersection(shapes.get(1),shapes.get(2));

Ответы [ 4 ]

3 голосов
/ 15 сентября 2011

Проблема в том, что ваш метод принимает объект childA или childB в качестве аргумента, и вы вместо него задаете объект base

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

function(base a,base b){}

, что вы можете вместо этого изменить переменные a и b на

childA a = new childA();
childB b = new childB();

Возможно, вам стоит взглянутьпри переопределении метода вместо перегрузки, если вы хотите сохранить использование базы вместо childA или childB.

вы определяете метод в базе

someMethod(){
  //do something
}

, а затем переопределяете его в дочерних классах, например

@override
someMethod(){
  //do something specific to childA
}

, тогда когда вы делаете

base a = new childA();

и вызов

a.doSomething();

вызовет переопределенный метод в childA

1 голос
/ 15 сентября 2011

У меня сработало следующее:

class user9
{
    static class base
    {
    }

    static class childA extends base
    {
    }

    static class childB extends base
    {
    }

    static void function ( childA a , childB b )
    {
    }

    static void function ( childA a1  , childA a2 )
    {
    }

    public static void main ( String [ ] args )
    {
        childA a = new childA ( ) ;
        childB b = new childB (  ) ;
        function ( a , b ) ;
        function ( a , a ) ;
    }
}
0 голосов
/ 15 сентября 2011

Вас может заинтересовать Шаблон посетителя .

0 голосов
/ 15 сентября 2011
abstract class Base{};

class ChildA extends Base{};
class ChildB extends Base{};

public class JavaTest {

    public static void function( ChildA a, ChildA a2 ) {
        //do something
    }

    public static void function( ChildA a, ChildB b ) {
        //do something else
    }

    public static void function( Base a, Base a2 ) {
        //do something
    }

    public static void main(String[] args) {
        function( new ChildA(), new ChildA() );
        function( new ChildA(), new ChildB() );
        function( new ChildB(), new ChildA() ); //Uses function(Base, Base)
    }
}

Вот пример кода, который использует 2 указанные вами перегрузки и предложенную обобщенную перегрузку @Ben. Как упомянуто в моем комментарии, вы должны отказаться от использования универсальной перегрузки, если вы хотите использовать определенные функции ChildA / B.

...