1

我有两个班级:TeacherCoordinatorCoordinator延伸Teacher

基本上我想创建一个可以接受Teacher实例或Coordinator实例的实例变量。

我知道这很容易通过编写Teacher exp = new Teacher()or来实现Teacher exp = new Coordinator(),但是当我这样做时,我只能在应用或访问正常的引用变量时访问Teacher方法和属性。我的问题是,有没有另一种方法,我只使用一个可以分配给教师或协调员对象的实例变量,并使用这个变量来调用分配给对象引用变量的对象的任何属性/方法?new Coordinator()new Teacher()

4

5 回答 5

8

您可以检查 exp 是否为Coordinatorthen 强制转换并相应地调用其函数:

if(exp instanceof Coordinator) {
    ((Coordinator)exp).foo();
}

如果你有几件事想做,你可以在本地范围内创建一个变量并重复使用它:

if(exp instanceof Coordinator) {
    Coordinator expCoord = (Coordinator)exp;
    expCoord.foo();
    expCoord.bar();
    expCoord.baz();
}
于 2012-12-27T23:47:34.473 回答
1

除非您要调用的所有方法都存在于父类中,否则无法做到这一点。

您可以将 Teacher 变量中的内容转换为 Coordinator,但如果 Teacher 变量中的内容不是真正的 Coordinator 对象实例,它将失败。

((Coordinator)exp).coordinate();
于 2012-12-27T23:48:26.610 回答
0

是的,你是对的,

这里同样的概念实现为父子关系因为子类的实例可以访问子类和父类的属性,但是父类的实例只能访问子类的属性......

这就是为什么它正在发生。

于 2012-12-29T17:43:56.927 回答
0

每当您想调用 的方法时Coordinator,都必须将对象转换为Coordinator第一个。

((Coordinator)myTeacher).coordinatorMethod();
于 2012-12-27T23:47:42.810 回答
0

不,因为类型安全。但你总是可以这样做:

Teacher exp = new Coordinator()
((Coordinator)exp).someCoordinatorMethodOrProperty()
于 2012-12-27T23:47:54.260 回答