Base类将通过Data类型接收未知的数据结构。为了打印数据类型对象的内容,派生类需要重写printObj方法。对于此示例,数据类型对象包含一个字符串字段。如何重写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();
}
}
策略模式
您可以通过使用将可打印功能/算法分开的简单方法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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句