0

I want a Java interface equivalent in Erlang. How can I provide a -spec contract for the dialyzer that will allow me to get the as close as possible to functionality provided in Java?

Lets say I want something equivalent to this:

//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);
}
4

1 回答 1

3

您可以使用-callback属性来实现它:

%% Filename: sport.erl
-module(sport).

-callback setHomeTeam(Name :: string()) -> ok.
-callback setVisitingTeam(Name :: string()) -> ok.

然后每当你想提供这个接口时:

-behavior(sport).

但是,我目前无法想到一种在行为之间进行继承的方法。您可以使用包含相关属性的包含 .hrl 文件来模拟它-behaviour,而不是逐字指定它们,但这感觉很脏。

-specs如果行为模块与使用它们的模块一起分析或已经在 PLT 中,Dialyzer 将检查回调是否满足指定的要求。

于 2014-03-11T08:28:39.817 回答