我想要一个在Erlang中等效的Java接口。我如何为透析器提供一个-spec
合同,使我能够尽可能接近Java提供的功能?
假设我想要一个等价的东西:
//Filename: Sports.java
public interface Sports
{
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
//Filename: Football.java
public interface Football extends Sports
{
public void homeTeamScored(int points);
public void visitingTeamScored(int points);
public void endOfQuarter(int quarter);
}
//Filename: Hockey.java
public interface Hockey extends Sports
{
public void homeGoalScored();
public void visitingGoalScored();
public void endOfPeriod(int period);
public void overtimePeriod(int ot);
}
您可以使用-callback
属性实现此功能:
%% Filename: sport.erl
-module(sport).
-callback setHomeTeam(Name :: string()) -> ok.
-callback setVisitingTeam(Name :: string()) -> ok.
当你想提供这个接口时:
-behavior(sport).
然而,我目前不能想到一种方法来做行为之间的继承。您可以使用包含相关-behaviour
属性的.hrl文件来模拟它,而不是逐字指定它们,但这感觉很脏。
Dialyzer将检查回调是否满足指定的-specs
,如果行为模块与使用它们的模块一起分析或已经在PLT中。