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

标签 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));

最佳答案

问题是您的方法采用 childAchildB 对象作为参数,而您却给它一个 base 对象

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

function(base a,base b){}

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

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

如果您想继续使用 base 而不是 childA 或 childB,也许您应该看看方法重写而不是重载。

你在base中定义了一个方法

someMethod(){
  //do something
}

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

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

然后当你这样做

base a = new childA();

并调用

a.doSomething();

它将调用childA中重写的方法

关于java - 使用基类引用的派生类对象重载方法 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7434999/

相关文章:

java - 以某种方式在 Java 中处理无符号字节

java - 在 JavaFX WebView 加载页面之前显示加载图像

Java:System.out.println方法在打印字节数组时丢失了一些行

c++ - 用抽象类覆盖模板函数

javascript - AngularJS - 具有多种对象类型的 ngRepeat

java - jackson 注释中的多态性 : @JsonTypeInfo usage

c++ - 使用模板类的函数重载

java - repaint() 方法不会重新绘制我的屏幕

ios - Swift - 找不到重载......&无法转换表达式的类型

C++,函数重载问题