JAVA 实现潜在类型机制 --《JAVA编程思想》 63

为了尽可能地广泛应用代码,我们希望通过各类途径来放开类型所作的限制,但同时又不能丢失静态类型的检查。

在 Python 和 C++ 中便有这种解决方案,称为“潜在类型机制”或“结构化类型机制”。我们不关心具体类型,只要求实现某个方法子集(不要求是公共接口),我们便可进行调用。即“如果它走起来像鸭子,并且叫起来也像鸭子,那么你就可以将它当作鸭子对待”。

潜在机制类型可以横跨类继承结构,调用不属于某个公共接口的方法。

我们来看一段 Python 代码,如下所示:

class Dog:
	def speak(self):
		print "Arf!"
	def sit(self)
		print "Sitting!"
class Roboot:
	def speak(self):
		print "Click!"
	def sit(self)
		print "Clank!"
	def oilChange(self):
		pass
def perform(anything):
	anything.speak()
	anything.sit()
a = Dog()
b = Reboot()
perform(a)
perform(b)

anything 可以是任何类型,只要该对象支持 speak() 和 sit() 方法,就能正常执行,否则会得到运行时异常。

但 JAVA 中并不能直接支持潜在类型机制,需要我们实现一个类或者接口,调用公共方法才能达到此类需求。

public interface Action {
    
    

    void speak();

    void sit();

}
public class Dog implements Action{
    
    

    @Override
    public void speak() {
    
    
        System.out.println("Arf!");
    }

    @Override
    public void sit() {
    
    
        System.out.println("Sitting!");
    }

}
public class Reboot implements Action{
    
    

    @Override
    public void speak(){
    
    
        System.out.println("Click!");
    }

    @Override
    public void sit(){
    
    
        System.out.println("Clank!");
    }

    public void oilChange(){
    
    
        return;
    }

}


public class ActionTest {
    
    

    public static void action(Action action) {
    
    
        action.speak();
        action.sit();
    }

    public static void main(String[] args) {
    
    
        action(new Dog());
        action(new Reboot());
    }

}
Arf!
Sitting!
Click!
Clank!

Dog 和 Reboot 分别实现 Action 接口,再通过泛化的 Action 调用需要共用的 speak() 和 sit() 方法。

但这里需要注意的是,假设我们需要抽取的公共方法不同名该怎么办?如下面这个 Duck 类。

public class Duck {
    
    

    public void cry(){
    
    
        System.out.println("DA!");
    }

    public void down(){
    
    
        System.out.println("PU!");
    }
    
}

我们需要将 cry() 对应 speak() ,down() 对应 sit() ,该怎么办呢?

其实也不复杂,使用适配器模式,便可解决问题。

public class DuckAdapter extends Duck implements Action {
    
    

    @Override
    public void speak() {
    
    
        super.cry();
    }

    @Override
    public void sit() {
    
    
        super.down();
    }

}
public class ActionTest {
    
    

    public static void action(Action action) {
    
    
        action.speak();
        action.sit();
    }

    public static void main(String[] args) {
    
    
        action(new Dog());
        action(new Reboot());
        action(new DuckAdapter());
    }

}
Arf!
Sitting!
Click!
Clank!
DA!
PU!

DuckAdapter 继承 Duck ,实现 Action 接口,在实现接口的方法中再调用父类中需要作为共用的方法,从而更为优雅的实现潜在类型机制。

本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

おすすめ

転載: blog.csdn.net/BaymaxCS/article/details/120940719