实例化一个抽象类。 - >复制它,保留抽象方法的实现。
public abstract class Foo{…
public int myVar;
public abstract void do();
}//Foo
包裹中的其他地方:
public class Gha{ …
Foo testFoo = new Foo{
@Override
public void do(){
Log.i("" , "this is a special Foo"); //executable process
}//do
}//testFoo
…
}//Gha
我是否可以复制testFoo
的方式复制新testFoo
的{{1}} .do()
方法正文?
答案 0 :(得分:2)
您可以使用clone
。人们普遍不鼓励使用这种方法,但它确实有效。
例如:
public abstract class Foo implements Cloneable {
private int a;
private String b;
public Foo(int a, String b) {
this.a = a;
this.b = b;
}
public abstract void run();
public int getA() { return a; }
public String getB() { return b; }
@Override
public final Foo clone() {
try {
return (Foo) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError(); // Can't happen
}
}
}
然后,你可以这样做:
Foo original = new Foo(3, "bar") {
@Override
public void run() {
System.out.println("Hello, world!");
}
};
Foo copy = original.clone();
System.out.println(copy.getA());
System.out.println(copy.getB());
copy.run();
System.out.println(copy == original);
输出结果为:
3
bar
Hello, world!
false
另一种方法是使用Serializable
。
public abstract class Foo implements Serializable {
private int a;
private String b;
public Foo(int a, String b) {
this.a = a;
this.b = b;
}
public abstract void run();
public int getA() { return a; }
public String getB() { return b; }
public final Foo copy() {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new ObjectOutputStream(baos).writeObject(this);
return (Foo) new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())).readObject();
} catch (Exception e) {
throw new AssertionError();
}
}
}
使用此版本,将clone
替换为copy
,您将获得相同的结果。
答案 1 :(得分:1)
你可以这样做......
public class TestFoo extends Foo{
private static String TAG = TestFoo.class.getSimpleName();
@Override
public void do(){
Log.i(getTag() , “this is a special Foo”); //executable process
}
protected String getTag(){
return TAG;
}
}
然后实例化将执行do()的TestFoo对象。如果要为每个实例分别使用一个Tag,可以覆盖instanted类中的getTag()函数。不确定这是否是你需要的,但比评论更容易解释:P
注意强>
如果这是你要在很多地方做的事情,并且你不想在整个地方进行分类(在评论中提到),请看Paul Boddington的回答,特别是复制部分。