gpt4 book ai didi

ada - Ada 中的 builder 模式

转载 作者:行者123 更新时间:2023-12-04 03:13:09 24 4
gpt4 key购买 nike

我对 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;

    像这样的构建器模式(不知道这在 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;

    第一个问题:这个例子如何在 Ada 中实现?
    Build函数可以检查(在运行时)是否所有必需的属性都由所属函数初始化。

    第二个问题:这个检查是否可以(以一种神奇的方式)委托(delegate)给编译器,这样下面的例子就不能编译?

    declare
    Person : Person;
    begin
    -- Last_Name function not called
    Person := Person.Builder.First_Name("John")
    .Date_Of_Birth("1990-02-27")
    .Build();
    end;

    最佳答案

    如前所述,支持该问题的一种 Ada 方法是对不需要值的参数使用默认值:

    function Create (First_Name     : String;
    Middle_Name : String := "";
    Last_Name : String;
    Date_Of_Birth : String;
    Place_Of_Birth : String := "")
    return Person;

    它接受你所有的例子。

    关于ada - Ada 中的 builder 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55301449/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com