我对Ada还是陌生的,并且对Ada中面向对象的处理方式不是很熟练。:(
我想知道是否可以在Ada中实现类似模式的构建器?这种模式在Java编程语言中很常见。
一个简单的例子:假设我要为一个人物对象建模。一个人具有以下属性:
我可以实现四个(重载)Create函数来涵盖所有可能的组合:
declare
Person_1 : Person;
Person_2 : Person;
Person_3 : Person;
Person_4 : Person;
begin
Person_1 := Create(First_Name => "John",
Last_Name => "Doe",
Date_Of_Birth => "1990-02-27");
Person_2 := Create(First_Name => "John",
Middle_Name => "Michael",
Last_Name => "Doe",
Date_Of_Birth => "1990-02-27");
Person_3 := Create(First_Name => "John",
Last_Name => "Doe",
Date_Of_Birth => "1990-02-27",
Place_Of_Birth => "New York");
Person_4 := Create(First_Name => "John",
Middle_Name => "Michael",
Last_Name => "Doe",
Date_Of_Birth => "1990-02-27",
Place_Of_Birth => "New York");
end;
Run Code Online (Sandbox Code Playgroud)
像这样的构建器模式(不知道在Ada中是否可行):
declare
Person_1 : Person;
Person_2 : Person;
Person_3 : Person;
Person_4 : Person;
begin
Person_1 := Person.Builder.First_Name("John")
.Last_Name("Doe")
.Date_Of_Birth("1990-02-27")
.Build();
Person_2 := Person.Builder.First_Name("John")
.Middle_Name("Michael")
.Last_Name("Doe")
.Date_Of_Birth("1990-02-27")
.Build();
Person_3 := Person.Builder.First_Name("John")
.Last_Name("Doe")
.Date_Of_Birth("1990-02-27")
.Place_Of_Birth("New York")
.Build();
Person_4 := Person.Builder.First_Name("John")
.Middle_Name("Michael")
.Last_Name("Doe")
.Date_Of_Birth("1990-02-27")
.Place_Of_Birth("New York")
.Build();
end;
Run Code Online (Sandbox Code Playgroud)
第一个问题:该示例如何在Ada中实现?
该Build函数可以(在运行时)检查所有必需属性是否由所属函数初始化。
第二个问题:可以(以一种神奇的方式)将该检查委托给编译器,以便以下示例无法编译吗?
declare
Person : Person;
begin
-- Last_Name function not called
Person := Person.Builder.First_Name("John")
.Date_Of_Birth("1990-02-27")
.Build();
end;
Run Code Online (Sandbox Code Playgroud)
如上所述,支持问题的一种Ada方法是对不需要其值的参数使用默认值:
function Create (First_Name : String;
Middle_Name : String := "";
Last_Name : String;
Date_Of_Birth : String;
Place_Of_Birth : String := "")
return Person;
Run Code Online (Sandbox Code Playgroud)
接受您所有的示例。