Dart - 试图理解“工厂”构造函数的价值

2024-03-26

如果我理解正确的话:

"A factory constructor affords an abstract class to be 
    instantiated by another class, despite being abstract." 

例如:

abstract class Animal {
   String makeNoise(String sound);
   String chooseColor(String color);
   factory Animal() => new Cat(); 
}

class Cat implements Animal {
   String makeNoise(String noise) => noise;
   String chooseColor(color) => color;
}

上面的内容允许我这样做:

Cat cat = new Animal();
var catSound = cat.makeNoise('Meow');
var catColor = cat.chooseColor('black');
print(catSound); // Meow

它也阻止我这样做:

class Dog implements Animal {
 int age;
 String makeNoise(String noise) => noise;
 String chooseColor(color) => color;
}

Dog dog = new Animal(); // <-- Not allowed because of the factory constructor

因此,如果我对所有这些都是正确的,我就会问为什么要为动物添加额外的代码?

如果您打算使用动物的工厂构造函数,它只创建猫,为什么不直接使用具有所需方法/属性的 Cat 类呢?

或者,是带有像上面这样的工厂构造函数的 Animal 类的目的,真的是专门为 Cat 类设计的接口吗?


我不认为问题出在factory.

您的代码最初是错误的。

看看这段代码并得出你的结论。

Locomotive locomotive = new SomethingWithSmokeFromChimney();

现在看看这段代码。

Plant plant = new SomethingWithSmokeFromChimney();

你错误地认为地球上所有的动物(甚至狗)都是猫。

Cat cat = new Animal();

如果你想要这个。

Cat cat = new Animal();
Dog dog = new Animal();

那么(如果我正确理解你的话)你也想要这个。

// Cat cat = new Animal();
// Dog dog = new Animal(); 
Dog dog = new Cat();

P.S.

同样的错误结论但没有factory.

void main() {
  Cat cat = new Animal();
  Dog dog = new Animal();
}

class Animal {
}

class Cat implements Animal {
}

class Dog implements Animal {
}

但这段代码(取决于文档)可能被认为是正确的。

void main() {
  Cat cat = new Animal("cat");
  Dog dog = new Animal("dog");
}

abstract class Animal {
  factory Animal(String type) {
    switch(type) {
      case "cat":
        return new Cat();
      case "dog":
        return new Dog();
      default:
        throw "The '$type' is not an animal";
    }
  }
}

class Cat implements Animal {
}

class Dog implements Animal {
}

抽象类的工厂构造函数可以(默认)返​​回该抽象类的一些默认实现。

abstract class Future<T> {
   factory Future(computation()) {
    _Future result = new _Future<T>();
    Timer.run(() {
      try {
        result._complete(computation());
      } catch (e, s) {
        result._completeError(e, s);
      }
    });
    return result;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart - 试图理解“工厂”构造函数的价值 的相关文章

  • Flutter:在 Android 上获取本地 IP 地址

    如何在 Flutter 中获取我的 Android 设备的本地 IP 地址 这应该是 当连接到 WIFI 时 我的路由器通过 DHCP 分配的本地 IP 地址 如果连接到 VPN 则由我的 VPN 服务器分配的 VPN 网络中的本地 IP
  • 如何通过单击颤动推送通知来打开特定屏幕

    我试图在单击推送通知时打开特定屏幕 我的有效负载如下所示 var payload notification title notificationTitle body notificationMessage click action scre
  • 如何将资产图像转换为文件?

    有没有办法将资产图像用作文件 我需要一个文件 以便可以使用它通过 http 在互联网上进行测试 我尝试过 Stackoverflow com 的一些答案 如何使用 image file 加载图像 https stackoverflow co
  • 颤动相机显得拉伸

    我一直在玩颤振 到目前为止我很喜欢它 但我在让相机工作时遇到了问题 我按照本页上的说明进行操作https pub dartlang org packages camera https pub dartlang org packages ca
  • 保留选项卡视图页面之间的状态

    issue 我有两个ListViews渲染内部TabBarView用一个TabController 我如何在每个之间保留状态 由于缺乏更好的词 ListView这样 1 小部件不会重建 2 ListView选项卡之间的位置会被记住 相关代码
  • 将标头添加到 SecureSocket 或 SecurityContext 到 WebSpcket

    WebSocket 可以选择向请求添加标头 但不能向其中添加 SecurityContext SecureSocket 具有 SecurityContext 因此我可以添加 ssl 证书 但无法添加标头 对此有什么想法吗 UPDATE 我正
  • 如何使聚合物元素可拖动

    我正在尝试启用HTML5 拖放到自定义聚合物元素上但它不起作用 如果没有聚合物 可以只添加draggable属性 这是我在 Dart 中的代码 我的组件 html
  • 如何在颤动中动态禁用工具提示?

    我可以静态禁用工具提示 但我想在单击平按钮时动态禁用工具提示 但是无法动态禁用 我不知道该怎么做 这是我的代码 import package flutter material dart void main runApp MaterialAp
  • Flutter SOAP:如何在 Flutter 中使用 SOAP?

    如何在 Flutter 中使用 SOAP Api 调用 我试过休息通话工作正常 我需要在 flutter 中构建 SOAP 调用 请分享如何在flutter中调用SOAP 参考此链接成功调用SOAPhttps dartpad dartlan
  • 嵌套 Polymer Dart UI 中的自定义事件

    我在概念化如何访问特定的 CustomEvent 时遇到一些困难 这是我的问题 我有一个name form html我导入的nok html and pt html name form html有一个自定义事件 用于发布表单的可观察模型 然
  • 如何在 Dart 中动态地将文件输入添加到 FormData?

    我正在尝试使用 FormData 类通过 HttpRequest send 将数据发送到我的服务器 我需要使用多个字段执行 POST 请求 它的工作原理应该与以下 Javascript 代码相同 Upload File var upload
  • flutter SDK是否提供了为Windows Phone开发应用程序的框架?

    我想知道google是否计划支持除iOS和Android以外的任何其他平台使用Flutter进行跨平台开发 像React Native Windows for React Native一样 Flutter是否有支持Windows Phone
  • 如何在加载到页面之前初始化聚合物元素的国际化

    我正在使用 Dart 构建 Polymer 应用程序 由于我在 Polymer 元素中使用 Dart 的国际化功能 因此我想在创建 Polymer 元素之前初始化国际化消息 并在 Polymer 元素中显示给定区域设置的适当消息 如何才能做
  • 禁用向下拖动以关闭 showModalBottomSheet

    如何在底部表单模态中禁用 转义向下拖动手势 以便用户可以在模态中进行交互而不会意外关闭模态 下面用实际的模态底部表进行了更新 return showModalBottomSheet context context builder Build
  • Dart如何向字符串数字添加逗号

    我正在尝试适应这一点 在数字字符串中插入逗号 https stackoverflow com questions 721304 insert commas into number string在 Dart 工作 但没有运气 其中任何一个都不
  • Dart 是单线程的,但为什么它使用 Future 对象并执行异步操作

    在文档中 Dart 是单线程的 但为了一次执行两个操作 我们使用与线程相同工作的 future 对象 使用Future对象 futures 来执行异步操作 如果 Dart 是单线程的 那么为什么它允许执行异步操作 Note 异步操作是并行操
  • CustomPainter 使用 Listenable 重绘

    CustomPainter 类似乎有几种触发重绘的方法 我让我的画家使用 shouldRepaint 方法 但是 我希望我的画家对可监听中的更改做出反应 而不是轮询更改 Flutter 文档指出 触发重绘的最有效方法是 扩展此类并向 Cus
  • 如何在 Flutter/Dart 中使用带有基类的 Provider

    我有这样的基类和派生类 abstract class A extends ChangeNotifier class B extends A 我正在使用这样的提供者 ChangeNotifierProvider b create contex
  • 如何使用 Firebase_Auth 和 Flutter 登录 Twitter

    一个人应该如何编程使用 Twitter 登录特征使用firebase auth https pub dev packages firebase auth和颤动 我看到一些使用的例子flutter twitter login https pu
  • 如何在父视图和子视图中使用组件两次(DI 是共享的,comp 是单例)

    我有一个按钮组件 具有应用程序特定行为 我打算在应用程序中广泛使用它 问题是 当我有一个使用此按钮的父 子视图时 单击父按钮会触发子视图按钮的 操作 如果不这样做 您自然不会明白发生了什么有多年的面向对象编程经验 让年轻的学校新手使用 da

随机推荐

  • 如何使用 CSS 动态调整内容区域大小而不使用 JavaScript

    我想要的是这样的 当浏览器窗口调整大小时 蓝色区域也会调整大小 标题可见 蓝色区域从标题结束处开始 不是标题后面或上方 蓝色区域在页脚之前结束 蓝色区域和页脚之间存在 5 个黄色像素 这只能通过 CSS 和 HTML 实现 无需任何 jav
  • 如何从 Kendo 网格中删除所有行

    我在用Kendo grid 我想从中删除所有行Kendo grid using JavaScript 我使用 for 循环删除了它们 但我想找到删除所有行的最佳方法 尝试按照代码进行操作 var grid Grid data kendoGr
  • mongodb show dbs list数据库失败

    我是 mongodb 的新手 我刚刚在我的MAC上安装了mongoDB 看完这个 YouTube 视频后 在 mongo shell 中 我输入 show dbs 并得到有线输出 请帮助我理解并解决这个问题 gt show dbs 2017
  • 在 JDBC 中插入单引号以进行 SQL 查询不起作用

    我在通过 Oracle JDBC 在 JAVA 的准备好的语句中使用单引号时遇到了处理单引号的问题 假设我们有一张 Restaurant 表 其中一列 Restaurant name 的值为 1 Jack s Deli 我想使用一个简单的准
  • 使用另一个对话框的功能更改 jQuery-UI 对话框的标题

    为什么第二个 jQuery UI 对话框标题在弹出时不改变 第一个对话框我使用以下命令更改框的标题 attr title Confirm 它将第一个框的标题更改为 确认 就像它应该有的那样 现在 当第二个框弹出时 它应该将标题更改为 消息
  • 将 std::hash 专门化为依赖类型

    我已经定义了这个模板类结构 template
  • 尝试获取已安装应用程序列表时出现 TransactionTooLargeException

    作为我的应用程序的一部分 我通过使用 ApplicationPackageManager getInstalledApplications 获取设备上安装的应用程序列表 但对于某些用户 我收到崩溃报告说 android osBinderPr
  • 视图漂浮在所有 ViewController 之上

    在 iOS 上 视图是否可能始终漂浮在所有其他视图之上 我问这个是因为我想要实现的是一个漂浮在 ViewController 之上的视图 然后一个模态视图控制器滑入 同时该特定视图仍然漂浮在该模态视图控制器上 希望你明白我想说的 有 您可以
  • 程序员多久会被要求编写一个 makefile 文件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从当前文化中获取货币?

    有没有办法从应用程序文化设置动态获取当前信息 基本上 如果用户将文化设置为美国 我想知道货币是美元 或者如果他们将其设置为英国 我想知道英镑等 等等 这样我就可以在付款时将此信息发送给 PayPal 使用 RegionInfo ISOCur
  • 根据当前值更新 MongoDB 中的值

    我想做这样的事情 但是this关键字似乎没有在更新语句中设置 db items update foo set bar this foo false true 我必须使用eval来完成这个 是的 您不能引用修饰符中的其他字段 您必须使用 db
  • 使 MongoDB 中的表字段可文本搜索

    先决条件 已使用集合创建数据库posts它的架构如下 module exports function mongoose var Schema mongoose Schema var postSchema new Schema postID
  • Java TA-Lib 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找有关的文档TA Lib http www ta lib org index html在爪哇
  • 使用 SWIG 和 Python/C API 包装返回 std::map 的函数

    我想包装一个 C 例程 它返回一个std map整数和指向 C 类实例的指针 我在使用 SWIG 时遇到困难 希望能提供任何帮助 我试图通过一个简单的例子来将这个问题归结为它的本质 标题test h定义如下 File test h incl
  • 计算单元测试运行期间发生的GC数量[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我目前正在编写一个单元测试来查看给定方法的性能影响 从实践中我们观察到 当前在给定方法的执行过程中发生了很多GC 我想知道是否可以查看从
  • ASIHTTPRequest dealloc 和 EXC_BAD_ACCESS 问题

    我使用一组 ASIHTTPRequest 包装器 AsyncImageLoader 来下载 UITableView 中单元格的图像 我在处理 ASIHTTPRequests 生命周期时遇到问题 如果我释放它们 如果我在它们尝试加载图像时继续
  • 警告:require_once():http:// 包装器在服务器配置中被allow_url_include=0 禁用

    我试图通过以下方式在页面中包含 php 文件 require once http localhost web a php 我收到错误 Warning require once http wrapper is disabled in the
  • Jodatime的LocalDateTime第一次使用时很慢

    我目前正在一个 java 项目中测试一些 webapp 技术 并且想知道为什么页面有时加载速度很快 有时需要近 5 秒才能加载 我终于发现是这条线 LocalDateTime now new LocalDateTime 第一次调用时 需要很
  • 使用 par 时图例框宽度不正确

    我有问题 我的图例太大 我的代码 par mfrow c 1 2 hist alvsloss breaks 100 freq F main Histogramm density curve gaussian kernel n and fit
  • Dart - 试图理解“工厂”构造函数的价值

    如果我理解正确的话 A factory constructor affords an abstract class to be instantiated by another class despite being abstract 例如