abstract 相关问题

abstract是由多种面向对象编程语言共享的关键字。可以将方法和类标记为抽象,以指示它们不包含应用程序逻辑的完整实现,并且必须进行扩展。抽象类无法实例化,其目的是为其子类提供统一的接口,以及不必为每个子类重新实现的常用方法的实现。

为什么Traits不能直接实例化?

在 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 仅旨在以细粒度且一致的方式对功能进行分组。它是通过使开发人员能够在生活在不同类层次结构中的多个独立类中减少单继承的一些限制,其中类只是提供一种继承模板并强制继承类实现抽象方法。

回答 4 投票 0

在非抽象类中使用抽象方法

我得到了抽象类ContentClass 公共抽象类 ContentClass { 公共抽象字符串 getClassType(); 公共抽象字符串 getSortId(); } 以及非抽象类 Node 公开

回答 2 投票 0

KMS 解密结果未分配给抽象类静态变量

我们正在 AWS lambda 函数中加密环境变量“dbPassword”,并尝试解密打字稿文件中的加密值。 从“aws-sdk”导入*作为AWS; 合作...

回答 1 投票 0

当我需要更改对象的类型时,有没有一种优雅的方法来重新创建对象?

我的一个练习任务是让战士参加任务,以及一个可以计数/过滤/跟踪战士和任务的聚合器类。 我有一个 Fighter 抽象类和三个

回答 1 投票 0

Flutter 抽象类为 getter 提供默认值

我有一个抽象类,我希望其中两个字段有一个默认值。但您也应该能够覆盖它们。目前我有这个: 抽象类虚拟{ // ... 持续时间

回答 1 投票 0

添加动态类进行继承和类名映射

我正在开发一个 Python 项目,其中有两个不同的对象文档映射器 (ODM):Beanie 和 Bunnet,用于管理数据库中的数据。每个 ODM 都需要不同的类结构来定义...

回答 1 投票 0

C++ 多态性不适用于 ESP-IDF

我有一个抽象类 命名空间 AComp { A级 { 民众: 虚拟无效函数()= 0; 虚拟~A(); }; A::~A() { } } 我还有一个抽象子类,它没有

回答 1 投票 0

抽象方法中的可选参数?可以吗?

我有一个抽象基类。 我有 2 个来自该基类的派生类。 无论如何,我的类之一是否可以忽略抽象覆盖用法中的字符串参数? 或者我必须...

回答 3 投票 0

如何在其子类(kotlin 或 java)中重写抽象类的抽象内部类

所以基本上我有一个代表下面的二叉树的抽象类。我想创建一个名为 RBTree 的子类,它将利用 BinaryTree 中的所有抽象,包括以下功能:

回答 1 投票 0

为什么我们在Java中需要抽象类? [已关闭]

为什么我们在Java中需要抽象类?如果你永远不会把它变成一个物体,为什么首先要拥有它呢?你如何使用它?为什么它在那里? 我想知道与abstr同样的事情......

回答 3 投票 0

如何通过反射调用静态抽象方法? [重复]

我试图通过反射调用静态抽象方法。在接口上声明静态抽象方法是一项预览功能,您可以在此处阅读更多内容。 当调用非静态抽象时...

回答 2 投票 0

如何使用抽象类中的方法而不扩展它[关闭]

我正在创建一个程序来说明抽象类。我被它的逻辑困住了。以下是说明: 编写一个程序来创建一组称为“实体”的对象。这些物体应该...

回答 1 投票 0

我需要在子类中重写父类中的非抽象方法吗?这个非抽象方法是在接口中定义的

我有一个界面 公共接口 PushRequest { 无效 setId(int var1); 无效 setSysCode(String var1); 无效 setServerURL(String var1); 无效 setWorkflowWhitelist(ArrayList 我有一个界面 public interface PushRequest { void setId(int var1); void setSysCode(String var1); void setServerURL(String var1); void setWorkflowWhitelist(ArrayList<String> var1); void setUserWhitelist(ArrayList<String> var1); void pushData(OfsPushRequestData var1); } 我的抽象类实现了接口 public abstract class TodoSend implements PushRequest { public int id; public String syscode; public String serverurl; public ArrayList<String> workflowwhitelist; public ArrayList<String> userwhitelist; protected String workflowPcUrl; protected String workflowMobileUrl; public TodoSend() { this.workflowPcUrl = this.serverurl + "/spa/workflow/static4form/index.html?#/main/workflow/req?requestid="; this.workflowMobileUrl = this.serverurl + "/spa/workflow/static4mobileform/index.html?#/req?requestid=%s&f_weaver_belongto_userid=%s"; } public void setId(int id) { this.id = id; } public void setSysCode(String syscode) { this.syscode = syscode; } public void setServerURL(String serverurl) { this.serverurl = serverurl; } public void setWorkflowWhitelist(ArrayList<String> arrayList) { this.workflowwhitelist = arrayList; } public void setUserWhitelist(ArrayList<String> arrayList) { this.workflowwhitelist = arrayList; } public void pushData(OfsPushRequestData ofsPushRequestData) { ArrayList<DataObj> dataObjList = ofsPushRequestData.getDataObjList(); Iterator var3 = dataObjList.iterator(); while(true) { ArrayList deldatas; do { if (!var3.hasNext()) { return; } DataObj dataObj = (DataObj)var3.next(); ArrayList<RequestStatusObj> tododatas = dataObj.getTododatas(); if (CollUtil.isNotEmpty(tododatas)) { Iterator var6 = tododatas.iterator(); while(var6.hasNext()) { RequestStatusObj tododata = (RequestStatusObj)var6.next(); this.todoPush(tododata); } } ArrayList<RequestStatusObj> donedatas = dataObj.getDonedatas(); if (CollUtil.isNotEmpty(donedatas)) { Iterator var11 = donedatas.iterator(); while(var11.hasNext()) { RequestStatusObj doneData = (RequestStatusObj)var11.next(); this.donePush(doneData); } } deldatas = dataObj.getDeldatas(); } while(!CollUtil.isNotEmpty(deldatas)); Iterator var13 = deldatas.iterator(); while(var13.hasNext()) { RequestStatusObj deldata = (RequestStatusObj)var13.next(); this.delPush(deldata); } } } public abstract void todoPush(RequestStatusObj var1); public abstract void donePush(RequestStatusObj var1); public abstract void delPush(RequestStatusObj var1); } 我的类继承了抽象类 public class TodoSendImpl extends TodoSend { @Override public void todoPush(RequestStatusObj requestStatusObj) { } @Override public void donePush(RequestStatusObj requestStatusObj) { } @Override public void delPush(RequestStatusObj requestStatusObj) { } } 但我的想法告诉我出了问题 类“TodoSendImpl”必须声明为抽象或在“PushRequest”中实现抽象方法“setWorkflowWhitelist(ArrayList)” setWorkflowWhitelist 不是已经在抽象类中实现了吗 我还需要在TodoSendImpl类中实现吗 TodoSendImpl 类中没有实现 setWorkflowWhitelist 方法,仅在抽象类中实现 不,根本不强制实现(在子类中)已经实现的方法(在抽象类中)。请检查代码中的类型错误。

回答 1 投票 0

抽象方法没有主体?

我是Java新手(已经读书4个月了)。所以我的问题可能显得太简单了。我的理解是抽象方法没有主体,不能提供实现 所以嗬...

回答 7 投票 0

在 Python 3 中创建抽象属性会导致 AttributeError

如何在Python中创建抽象属性? 导入 abc MyClass 类(abc.ABC): @abc.abstractmethod @财产 def foo(自我): 经过 导致错误 AttributeError: attrib...

回答 2 投票 0

我在这个java程序中犯了什么错误吗

为什么这个java接口和抽象程序不起作用,我花了几乎一天的时间,但找不到任何答案。有人可以帮忙吗? 我正在学习java中的面向对象编程。

回答 0 投票 0

为什么我可以在Python中用抽象方法实例化类?

我注意到一个有abstractmethod的类如果不继承ABC,还是可以被实例化的。这似乎与文档形成对比: 使用这个装饰器需要...

回答 1 投票 0

如何使子类静态值分离? [重复]

我对抽象类中的静态变量有疑问,因为当我将一个类扩展为子类时,它与所有其他类共享相同的变量值我想知道是否有一个...

回答 1 投票 0

如何序列化抽象类

我正在使用 Gson 序列化我的对象,但我遇到了一个问题,即在我成功保存抽象对象后您无法读取它们。我发现这与我的问题有关,但它

回答 0 投票 0

“无法直接访问抽象成员。”我如何克服继承接口的这个方面?

类喵():输入连接{ 覆盖有趣的 getTextBeforeCursor(之前:Int,之后:Int):CharSequence?{ 返回 super.getTextBeforeCursor(之前,之后) } } 但是 whai 确实继承了一个

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.