为了尽可能地广泛应用代码,我们希望通过各类途径来放开类型所作的限制,但同时又不能丢失静态类型的检查。
在 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 接口,在实现接口的方法中再调用父类中需要作为共用的方法,从而更为优雅的实现潜在类型机制。
本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。
若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!