使用基类引用的派生类对象重载方法 - java

时间:2011-09-15 17:25:57

标签: java polymorphism overloading

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 个答案:

答案 0 :(得分:3)

问题是您的方法将childAchildB对象作为参数,而是为其提供base对象

更改方法签名以将基类作为参数,这样可以解决问题,但是会丢失多态性

function(base a,base b){}

您可以做的是将变量ab更改为

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

如果你想坚持使用base而不是childA或childB,也许你应该看看方法覆盖而不是重载。

你在基地

中定义一个方法
someMethod(){
  //do something
}

然后在您的子类中覆盖它,如

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

然后当你做

base a = new childA();

并致电

a.doSomething();

它会调用childA中的覆盖方法

答案 1 :(得分:1)

以下对我有用:

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 ) ;
    }
}

答案 2 :(得分:0)

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函数,你必须在使用泛型重载时抛弃它。

答案 3 :(得分:0)

您可能对Visitor pattern感兴趣。