克隆实例化的抽象类

时间:2016-04-14 20:10:23

标签: java android abstract

实例化一个抽象类。 - >复制它,保留抽象方法的实现。

    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()方法正文?

2 个答案:

答案 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的回答,特别是复制部分。