Base类将通过Data类型接收未知数据结构。 Derived类需要重写printObj方法才能打印Data类型对象的内容。对于此示例,Data类型对象包含一个字符串字段。如何覆盖printObj()以打印String消息变量的内容?
// generic class
public abstract class Base <T>{
T obj;
public Base(T t){
obj = t;
}
public T getObject(){
return obj;
}
public void setObject(T t){
obj = t;
}
public abstract void printObj();
}
// specific class
public class Derived<T> extends Base<T>{
public Derived(T t) {
super(t);
}
@Override
public void printObj() {
//?????
}
}
// data can be changed
public class Data {
String message;
public Data(String msg){
message = msg;
}
}
// application class
public class App {
public static void main(String[] args) {
Data d = new Data("Hello");
Derived<Data> dClass = new Derived<Data>(d);
dClass.printObj();
}
}
答案 0 :(得分:3)
T
中的Derived<T>
可以是任何内容,因此编译器不知道它有message
字段。也许你想要
public class Derived<T extends Data> extends Base<T>
然后你可以
@Override
public void printObj() {
whatever(obj.message);
}
答案 1 :(得分:1)
在computer programming中,策略模式(也称为策略模式)是software design pattern,可启用algorithm在运行时选择的行为。
策略模式
您可以使用分离出可打印功能/算法的简单interface
轻松地使用上述设计模式解决此问题。此类型的任何对象都将被称为可打印对象。
interface Printable{public void print();}
现在它应该像T extends Printable
这意味着Printable
abstract class Base<T extends Printable> implements Printable{...}
现在T extends Printable
,以便您可以将其向下转换为Printable
,并可以在其上调用print()
方法,该方法将调用传递的可打印对象的方法。
class Derived<T extends Printable> extends Base<T> {
...
@Override
public void print() {
((Printable)getObject()).print();
}
}
此处Data
是一个可打印的对象,只需实现Printable
接口。
class Data implements Printable {
String message;
...
@Override
public void print() {
System.out.println(message);
}
}
让我们再创建一个类,以了解使用T extends Data
无法实现的设计模式的好处。
class NonData implements Printable {
String message;
...
@Override
public void print() {
System.out.println(message);
}
}
主要课程:
Data d = new Data("Hello");
Derived<Data> dClass = new Derived<Data>(d);
dClass.printObj(); // output Hello
NonData d1 = new NonData("Bye");
Derived<NonData> dClass1 = new Derived<NonData>(d1);
dClass1.printObj(); // output Bye