abstract是由多种面向对象编程语言共享的关键字。可以将方法和类标记为抽象,以指示它们不包含应用程序逻辑的完整实现,并且必须进行扩展。抽象类无法实例化,其目的是为其子类提供统一的接口,以及不必为每个子类重新实现的常用方法的实现。
当字段是抽象类型时,MapStruct 将模型的字段映射为空
我有一个类,它有一个字段,而该字段又是一个抽象类。我希望 MapStruct 能够从传入的 DTO 映射到内部模型,包括抽象的所有子字段......
我试图解决在 Haskell 中指定不同语言结构的抽象语法的问题,例如变量声明、数组声明、if-else 语句等,但我同意...
可以肯定的是,Dart 现在是否删除了显式定义接口,转而通过抽象隐式定义它? 我在 Dart 和接口隔离原则中看到了它,但是我...
在C#中,如果默认所有接口成员都是public和abstract的,为什么我们不能在实现类时使用override呢?
在C#中,如果默认所有接口成员都是public和abstract的,为什么我们不能在实现类时使用override呢?虽然我们可以在抽象类中使用重写。 接口IE示例 { int Ara(...
使用系统; 使用 System.Collections.Generic; 使用 System.Linq; 使用系统文本; 使用 System.Threading.Tasks; 命名空间圆区域 { 内部课程计划 { //创建一个基础...
我一直在寻找这个问题的答案,但似乎找不到,所以我希望这里有人可以帮助我。 我正在用 Latex 写一篇论文,并且非常喜欢 \
我正在尝试做类似以下的事情 - 公共抽象类Utility { // 返回值不能缓存在类范围的字段中,因为它们需要由线程调用
TypeScript 编译器提供 noImplicitOverride 设置,如果设置为 true,则在覆盖非抽象成员时将强制使用 override 关键字。例如: 抽象类A { 公开
从子类集合中实例化类,同时保持对 Typescript 中静态成员的访问
假设你有 抽象类 A { ... } B 类扩展 A { ... } C 类扩展 A { ... } 等等等等 并且您希望在使用时拥有一种属性来区分这些类......
我有一个抽象类,我想生成一个与该类型的任何非抽象子类匹配的类型,而不是其实例。这可能吗? 抽象类A { } 函数 b(类型:
我的用例是我有2个抽象类(subClassA和subClassB),我想限制如果A类有某种方法(funcA),那么B类也必须有(funcA),反之亦然。 接口 A() { 酒吧...
我来自 PHP 世界,目前正在实现我的第一个 TypeScript 项目。不幸的是,很多我在 PHP 中已经习惯了很长时间的东西在这里不起作用。其中之一是
我有一个名为 Hospital.java 的接口 公共接口医院{ 公共无效操作(); 公共无效doScan(); 公共无效 doVaccination(); } 我有一个名为
Solidity 中的抽象合约类型错误:没有参数传递给基本构造函数。指定参数或将“AssetAcquisition”标记为抽象
我遇到了一个 Solidity 合约的问题,其中的错误要求我将代码编写为摘要。摘要意味着我的代码将不可部署。 这是一份旨在转移资产的合约,并且
接口中的数据成员是final、static和final,final方法不能被重写,那么我们如何在实现接口的类中实现抽象方法呢? 这怎么...
在 PHP 中测试特征时,我有点困惑为什么要引入特征。我做了一些小实验。首先我直接在类中调用特征方法 在 PHP 中测试特征时,我有点困惑为什么要引入特征。我做了一些小实验。首先我直接在类中调用特征方法 <?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } class TheWorldIsNotEnough { use HelloWorld; public function sayHellos() { $o = new HelloWorld(); $o->sayHello(); } } $o = new TheWorldIsNotEnough(); $o->sayHellos(); ?> 我收到一个错误 Fatal error: Cannot instantiate trait HelloWorld in C:\xampp\htdocs\test.php on line 35 但是当我这样做的时候 <?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } class MyHelloWorld { use HelloWorld; } class TheWorldIsNotEnough { use HelloWorld; public function sayHellos() { $o = new MyHelloWorld(); $o->sayHello(); } } $o = new TheWorldIsNotEnough(); $o->sayHellos(); ?> 我能够调用特征方法,结果显示“Hello World!”。 那么使用 Traits 的优点是什么?它与抽象类有何不同?请帮助我理解用法。谢谢。 Traits 不应被实例化。它们只是代码部分,您可以通过 use 在类中重用它们。您可以想象,trait代码会扩展并成为您的类的一部分。甚至令人悲伤的是: 特征本质上是语言辅助的复制和粘贴。 所以你的例子应该像这样工作: <?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } class TheWorldIsNotEnough { use HelloWorld; public function sayHellos() { // your trait defines this method, so now you can // think that this method is defined in your class directly $this->sayHello(); } } $o = new TheWorldIsNotEnough(); $o->sayHellos(); //or simply $o->sayHello(); ?> 感谢所有发布答案的人,但经过大量研究后得到了我真正寻找的答案。我的问题是是什么使 Traits 与抽象类、继承等现有方法不同。在类内部调用时实例化它是可以的,但最大的区别是我们可以通过这种方式在类中包含多个特征 use class1, class2; 如果两个类中存在相同的方法并且我们想使用 class2 中的方法时发生冲突,我们会这样做 use class1, class2 { class2::method1 insteadof class1; } 甚至特征也可以有多个这样定义的特征: trait Class1 { use trait1, trait2; } 与继承不同;如果特征具有静态属性,则使用该特征的每个类都具有这些属性的独立实例。 检查此链接http://php.net/manual/en/language.oop5.traits.php#107965 特征与继承的另一个区别是特征中定义的方法可以访问它们所使用的类的方法和属性,包括私有的。 http://php.net/manual/en/language.oop5.traits.php#109508. 与接口实现不同的是,所有特征方法都可以访问而无需再次定义。 好吧,这可能不是正确的方法,但我想出了一种如何使用 Traits 的方法,以及为什么它在某些情况下对我的项目更好。它们是类的一种扩展。如果您熟悉 CakePHP,这些 Traits 让我想起模型的行为或控制器的组件。只要查一下就可以了:-) 抽象类略有不同,因为您可以像这样使用它进行继承: abstract class HelloWorld { public function sayHello() { echo "Hello World!"; } abstract public function doFunnyStuff(); abstract public function doMoreFunnyStuff(); } class ConcreteHelloWorld extends HelloWorld { public function doFunnyStuff() { echo "Funny Hello!"; } public function doMoreFunnyStuff() { echo "More Funny Hello!"; } } $o = new ConcreteHelloWorld(); $o->sayHello(); // common property $o->doFunnyStuff(); // specialy implemented property $o->doMoreFunnyStuff(); // specialy impelemented property 特质更像是一个类的扩展。我正在 MVC 框架中使用 Traits 以这种方式扩展带有日志记录的类: trait Logger { public function saveLog($kindOf, $messasge, $serverity) { some_connect_to_DB_pseudo_code(); $sqlQuery = "INSERT INTO log (kindof, message, serverity) VALUES (".$kindof.", ".$message.", ".$serverity.")"; mysql_query($sqlQuery); // deprecated :-) } } class Controller extends AppController { use Logger; public function someAction($params) { $this->saveLog("CALL", __METHOD__." - started some Action with params: ".$params, 0); ... ... } } 它非常方便,因为我在每个类中都使用它,而且我不必在必须连接到数据库并生成 SQL 查询的地方再次编写所有这些行。由于我在整个 MVC 框架中拥有大量继承,因此我不必将 Logger 作为某些父类包含在内。只需将其与“use”关键字一起放入任何应该能够将日志信息发送到数据库的类中即可。 同样的事情对我来说也适用于调试消息,我只需写这样的东西: $this->debug("WARNING", $message); 我的调试特征正在制作一条格式良好的警告消息:-)希望它有助于理解。 Abstract和Trait类之间唯一的共同点是无法单独实例化a Trait/an Abstract。 但他们的目的不同。 Trait 仅旨在以细粒度且一致的方式对功能进行分组。它是通过使开发人员能够在生活在不同类层次结构中的多个独立类中减少单继承的一些限制,其中类只是提供一种继承模板并强制继承类实现抽象方法。
我得到了抽象类ContentClass 公共抽象类 ContentClass { 公共抽象字符串 getClassType(); 公共抽象字符串 getSortId(); } 以及非抽象类 Node 公开
我们正在 AWS lambda 函数中加密环境变量“dbPassword”,并尝试解密打字稿文件中的加密值。 从“aws-sdk”导入*作为AWS; 合作...
当我需要更改对象的类型时,有没有一种优雅的方法来重新创建对象?
我的一个练习任务是让战士参加任务,以及一个可以计数/过滤/跟踪战士和任务的聚合器类。 我有一个 Fighter 抽象类和三个
我有一个抽象类,我希望其中两个字段有一个默认值。但您也应该能够覆盖它们。目前我有这个: 抽象类虚拟{ // ... 持续时间