我很难选择一个类是具体的还是抽象的。另外,我不完全知道层次结构中的哪一点会使事情变得具体或抽象。问题是,我们如何确定一个类应该是抽象类还是具体类?你怎么知道什么时候一个类应该是抽象的?
回答
一般来说,如果您完全没有理由创建该类的实例,则该类应该是抽象的。例如,假设您有一个Shape类,它是Triangle,Square,Circle等的超类。由于“Shape”非常普遍,因此不应该有任何理由构造Shape对象,所以它应该是抽象的(或甚至可能是一个接口)。
所以可以肯定地说抽象类是一种我们感官无法感知的类。就像Shape只存在于_concept_而不是实际的对象一样。 –
这听起来很安全。例如,尽管可能有一个抽象类“Car”,其中包含“Truck”或“Jeep”等具体子类。 –
当所有子类都有一个共同的行为时,应该有一个具体的方法。
例如,车辆是一个抽象类,然后它由燃料驱动。这将是所有车辆(自行车除外)的常见行为 - 所以应该用具体的方法来描述,其他功能如班级(2轮车/ 4轮车),跑步细节(里程0-20/0-80),动力细节100cc-400cc)对于不同的车辆会有所不同,所以它应该抽象的方法。
抽象类意味着它是抽象的不完整。它需要另一个类来完成它和/或其功能。您需要扩展抽象类。
几件事情要记住,当你选择抽象类:
- 你想要的类不应该被实例化。
- 您想要继承此类
- 该类不完整,并且继承类必须完成其定义(通过重写抽象类的抽象方法)。
把一个抽象类想象成一个普通类,其中一些方法将在后面定义。
例如,您想要访问数据库,但不知道将使用哪个数据库。因此,您可以编写打开连接的部分,启动事务,访问数据库,关闭事务并释放连接。但是,由于该部分是数据库特定的,因此您将未实现获取连接的部分。所以,例如,访问MySQL的人会扩展你的类,并且只需要实现获取连接的部分。
同意你的例子,不会使用它作为一个更好的选择接口? –
不,因为该接口将无法保存示例的样板代码。 –
在我看来,抽象类和具体类之间唯一的区别是抽象类不能被“新”。
您可以在具体类之前放置一个抽象关键字来阻止其他人重新获取此类的对象。 (抽象类不一定要有抽象方法)
我建议你用接口而不是抽象类,因为Java是单继承,一个类只能有一个超类但可以实现多接口。
一个抽象类是不错的选择:
- 如果你认为你会使用继承计划,因为它提供了一个共同的基类实现派生类
- 如果你希望能够到宣布非公开成员。
- 如果你认为你需要当你想一些方法与定义来添加方法在未来
- - 这样一个抽象类可以有实际的实施细则非抽象的方法。
- 但是请记住抽象类不能实例化。它只能用作扩展抽象类的其他类的超类。
- 1. 什么是西格玛剪裁?你怎么知道什么时候应用它?
- 2. 为什么你需要知道抽象类的抽象方法是否抽象
- 3. 什么时候应该去接口,什么时候去抽象类?
- 4. 你怎么知道什么时候在Python中关闭文件?
- 5. 不知道什么时候使用抽象属性,什么时候不使用
- 6. 你怎么知道你什么时候需要单独的表格?
- 7. 什么时候你返回一个类,你什么时候返回一个HttpResponseMessage?
- 8. 什么时候去接口,什么时候去抽象类
- 9. 给定一个包,我怎么知道它的artifactId应该是什么?
- 10. 在C#中,什么时候应该使用一个结构,什么时候应该使用一个类?
- 11. 什么时候应该使用一个类,什么时候应该使用一个id?
- 12. iPhone的UITextView - 你怎么知道什么时候你附加的文本是不可见的
- 13. 什么时候应该使用抽象工厂模式
- 14. 什么时候该类应该实现一个接口,什么时候不应该接口?
- 15. node.js async.each回调,我怎么知道它什么时候完成?
- 16. 我怎么知道什么时候已经HTML完全呈现
- 17. Iphone CLLocationManager horizontalAccuracy更新。什么时候?我怎么知道它?
- 18. 我怎么知道什么时候不再点击按钮
- 19. 你怎么知道主要的启动活动是什么?
- 20. 你怎么知道一个函数是否返回一个值?
- 21. 一个人怎么知道什么时候在Clojure/Lisp中换行?
- 22. 我需要知道什么时候应该使用wp_redirect()?
- 23. 我们什么时候知道我们应该使用符号?
- 24. 什么时候应该一个类实现一个接口?
- 25. 为什么ClassLoader是一个抽象类?
- 26. Firefox不知道该怎么办的时候,而建设一个URL
- 27. 有什么方法可以知道什么时候创建了一个对象?
- 28. 一个过程如何知道它是什么时候背景?
- 29. 你怎么知道一个NSObject是否有某个属性?
- 30. 你什么时候知道何时使用TreeSet或LinkedList?
如果您可以提供一个[最小示例](http://stackoverflow.com/help/mcve),那将会很好,如果您想要一般答案,请参见第一个结果(https:// www.google.co.in/search?q=when+to+use+abstract+class&aq=f&oq=when+to+use+abstract+class&aqs=chrome.0.57j0l3j62l2.6617j0&sourceid=chrome&ie=UTF-8#q=when +到+使用+抽象类+ + +中爪哇)。 –