gpt4 book ai didi

Java从父对象调用子方法

转载 作者:行者123 更新时间:2023-12-02 02:31:49 24 4
gpt4 key购买 nike

我有下一种情况:

有一个抽象类

public abstract class SuperClass {
public abstract void getString();
public abstract void method2();
}

public class InheritClass1 extends SuperClass {
@Override
public void getString(){...};
@Override
public void method2(){...};
}

public class InheritClass2 extends SuperClass {
@Override
public void getString{...};
@Override
public void method2(){...};

public void customMethod(){...};
}

还有另一个类有一个接受 SuperClass 对象作为参数的方法。根据 getString 返回的字符串类型,我执行不同的操作。我的情况是,我试图在对象属于父类时调用子方法:

public class Processor {
public String method(SuperClass type) {
switch (type.getString()) {
case "1":
return "OK"
case "2":
return ((InheritClass2) type).customMethod()
}
}

我确实知道这是糟糕的设计,您能帮我找到解决此问题的最佳解决方案吗?也许泛型在某种程度上适合这种情况。另外,customMethod() 不应该是所有类的一部分。

最佳答案

由于只有一些(子)类实现 customMethod,我建议创建一个包含此方法的接口(interface):

public interface CustomInterface {
public String customMethod();
}

然后您的SuperClass 就可以保持原样。只有具有 customMethod 的子类/子类才会扩展您的 SuperClass 并实现此 CustomInterface。这样,未实现 CustomMethod 的子类(在其类中没有该方法,例如示例中的 InheritClass1)也将保持原样。

只有具有 CustomMethod 的子类(例如 InheritClass2)才需要稍微更改一下,说明它实现了这个新接口(interface):

public class InheritClass2 extends SuperClass implements CustomInteface {
// the rest stays the same
}

然后在您想要进行转换的部分中,您宁愿执行以下操作:

public class Processor {
public String method(SuperClass type) {
switch (type.getString()) {
case "1":
return "OK"
case "2":
String s = "";
if (type instance of CustomInterface) {
s = (CustomInterface type).customMethod();
}
return s;
}
}
}

以这种方式使用接口(interface)将有助于您实现所有子类,而不仅仅是一个实现 CustomInterface 的子类,因此,所有子类都将使用 instanceof code> 并转换为接口(interface)来调用 customMethod() - 您不必单独处理需要此方法的每个子项。

<小时/>

注意:您的代码显然是简化的示例,不清楚 getString() 方法是否只是返回子类的标识符,以便您知道可以转换哪些子类,然后调用自定义方法...如果这是您的 switch 和 getString 方法的目的 - 识别哪些类型实现了 customMethod() 并调用该方法,以及任何没有该方法的子类仅返回“OK” - 那么您可以执行以下操作:

public class SubClass1 extends SuperClass implements CustomInterface {
// other mehtods...
public String CustomMethod() { return "SomeString1"; }
}

public class SubClass2 extends SuperClass {
// other methods...
// this subclass does not have the CustomMethod()
}

public class SubClass3 extends SuperClass implements CustomInterface {
// other methods...
public String CustomMethod() { return "SomeString3"; }
}

那么你的处理器可能看起来像这样:

public class Processor {
public String method(SuperClass type) {
return (type instanceof CustomInterface) ? ((CustomInterface) type).CustomMethod() : "OK";
}

public static void main(String[] args) {
Processor p = new Processor();
SuperClass obj1 = new SubClass1();
SuperClass obj2 = new SubClass2();
SuperClass obj3 = new SubClass3();

System.out.println(p.method(obj1)); // prints: "SomeString1"
System.out.println(p.method(obj2)); // prints: "OK"
System.out.println(p.method(obj3)); // prints: "SomeString3"
}
}

如果你不明白三元运算符,那么你可以阅读 here这就是条件吗? exprTrue : exprFalse 语法。基本上这是一个简短的 if else 语句。








关于Java从父对象调用子方法,我们在Stack Overflow上找到一个类似的问题:

https://stackoverflow.com/questions/46978960/




24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com