在策略设计模式中获取对象的类名

时间:2016-10-24 18:56:04

标签: java design-patterns strategy-pattern

我想了解设计模式,我需要知道 我如何在已实现的接口类中检索类的名称,如 遵循:

public interface Flys {

   String fly();

}

// Class used if the Animal can fly

class ItFlys implements Flys{

    public String fly() {

        return getClass().getName()+" is Flying High"; //not working...gives me the ItFlys class name not Dog class name

    }

}

//Class used if the Animal can't fly

class CantFly implements Flys{

    public String fly() {

        return "I can't fly";

    }

}

代码来自:http://www.newthinktank.com/2012/08/strategy-design-pattern-tutorial/ 感谢

2 个答案:

答案 0 :(得分:2)

您遇到的问题是DogBird 都没有实现 Flys接口。相反,每个类包含实现。由于ItFlys在设计中不知道它包含在哪个类中,因此在其上调用fly()无法检测其外部的类。

您可以更改fly方法以取代代表“所有者”的Object并在所有者的班级上调用getName来解决问题:

public interface Flys {
   String fly(Object owner);
}

// Class used if the Animal can fly
class ItFlys implements Flys{
    public String fly(Object owner) {
        return owner.getClass().getName()+" is Flying High";
    }
}

现在Dog需要提供自己的fly()方法实现,将调用转发给flyingType

public String fly() {
    flyingType.fly(this);
}

答案 1 :(得分:0)

此行封装在ItFlys class中,因此它获取其包含类的名称。

return getClass().getName()+" is Flying High";

如果对象的实例可用,那么获取其Class的最简单方法是调用Object.getClass()。当然,这仅适用于所有继承Object的引用类型。假设您的Dog.java继承Object,那么您需要以下

return new Dog().getClass().getSimpleName() + " is Flying High";

编辑:getName()将在返回的String

中包含软件包名称