当我来到OOP的课程时,我终于有了我的阿哈。我一直在努力想出这个想法。现在我开始明白了,我想知道扩展类的目的是什么。在课堂上添加另一种方法会不会更简单?还是我错过了这一点?为什么要扩展一个类而不是仅仅向原始类添加一个新方法?
回答
如果你想添加功能的类添加一个方法。但是,有些情况下您想添加功能,但不能在基类中执行此操作。
最好的是用一个例子展示。如果将某个方法Radius
添加到类只有在类为Circle
时才有意义,则Rect
不具有半径。向基类中添加方法Radius
也是没有意义的,因为Rect
类也可以获得方法Radius
。
例子:
abstract class Shape
{
abstract public function Draw();
}
class Rect extends Shape
{
public function Draw()
{
}
}
class Circle extends Shape
{
public function Draw()
{
}
public function Radius()
{
}
}
我得到你要去的地方...然而,如果在扩展类中添加绘制方法而不是在形状类中绘制目的,从而使扩展类的全部理由(DRY编码)毫无意义? – TheBestJohn
形状类中的绘制方法应该是抽象的,没有办法绘制一个Shape。我调整了这个例子。 – JvdBerg
好了,现在看起来我已经有了更多的阅读和理解。感谢您指点我正确的方向。 – TheBestJohn
有时原来的类是不能更改库的一部分。
有时候你想用多种不同的方式来扩展超类。
例如(Java语法,而不是PHP但想法是相同的):
class Shape {
abstract double getArea();
}
class Square extends Shape {
double getArea() {
return size * size;
}
}
class Circle extends Shape {
double getArea() {
return radius * radius * Math.PI;
}
}
到接受型形状的参数可以在正方形以及圈传递的方法。该方法不需要知道它获取哪个,但仍然可以调用getArea()。如果您只是将该方法添加到Shape类,这将不起作用。
@vascowhite:你为什么编辑我的帖子?现在这是不正确的。 – user1701374
,因为它没有意义的方法有一个getCircumference()方法。为什么现在不正确?它看起来很适合我。你在方法中的计算是针对区域的。而且,自从我编辑它以来,你已经有三个upvotes(它在-1)。 – vascowhite
谢谢你们对我现在有意义的信息。 – TheBestJohn
这将是一个简化,但给你一个真实生活中的例子:
考虑您要创建一个内容管理系统,即一个脚本来显示基于用户输入您的网站的不同页面。
您可能希望每个页面(让我们称之为模块)具有特定的功能,例如在页面/模块上执行时允许执行的命令。这些不同的命令可能是每个模块类中的不同方法。
但是,如果您允许登录命令,无论用户当前位于您的网站中,该怎么办?即,这将是所有模块之间共享的命令。
您的解决方案可以通过拥有父模块类来解决,其中的登录方法将驻留在该模块类中,并且可以由所有模块执行。
// Your parent class
abstract class ParentModule
{
protected function login()
{
// Login stuff
}
}
// One of your modules
final class ArticleModule extends ParentModule
{
public function submit_article()
{
// An example function
}
}
// Another one of your modules that the user could still login from
final class AnotherModule extends ParentModule
{
public function another_command()
{
// Magic
}
}
您的控制器可能会看起来像下面的东西。
$module = new ArticleModule();
$module->login();
$module->submit_article();
最后,当你进入看着接口 - 带我永远理解这些 - 你将再次看到抽象类的好处。事实上,如果你完全理解抽象类的概念,你将更容易理解接口。
- 1. 仅向一个方向扩展SKSpriteNode
- 2. 为什么putExtra需要一个关键值对而不仅仅是一个值?
- 3. 如果一个类扩展了另一个类,扩展类可以被初始化而不是扩展它吗?
- 4. 为什么我的jQuery仅在一个方向上切换类?
- 5. 为什么一个“新”方法保存我的关系,而不是仅仅对其进行初始化
- 6. 为什么你会想要创建一个名为* foo()而不是仅仅是foo()的方法?
- 7. 为什么名称形成一种而不仅仅是一种类型?
- 8. 为什么案例类仅扩展Product而不扩展Product1,Product2,...,ProductN?
- 9. 为什么rbind需要一个循环来创建一个数据帧,而不仅仅是一个矩阵
- 10. 为什么我们需要一个明确的转换,而不是扩展方法而不是静态方法?
- 11. 如何向类中添加方法而不创建扩展它的新类。
- 12. DDD - 为什么实体的身份不仅仅是原始类型?
- 13. 如何获得EntityCollection <class>而不仅仅是一个类?
- 14. 仅向最接近的父类添加一个类
- 15. 为什么要使用一个DLL,而不是一类
- 16. 为什么Solr存储一个字段的原始/预先分析内容而不仅仅是索引?
- 17. 为什么使用“RIA Services Link”而不是仅仅是一个OData端点?
- 18. 我应该扩展这个类还是仅仅使用它?
- 19. 为什么要深入克隆一个JavaScript对象而不是仅仅创建一个副本?
- 20. 为什么他们想要一个'unsigned char *'而不仅仅是一个普通的字符串或'char *'
- 21. Ruby扩展Date类添加新方法
- 22. 为什么我需要*,*:在{...}之后而不是仅仅是{...}?
- 23. 为什么我的第一个Android MainActivity类扩展了ActionBarActivity而不是Activity?
- 24. 扩展一个泛类的原始类型警告
- 25. setTimeout为整个网站,而不仅仅是一个页面
- 26. 为什么Java中的类名(和其他)仅仅是一个建议而不是规则?
- 27. 为什么我不能添加一个从SimplePanel扩展到RootPanel的类?
- 28. 为什么所有记录都被删除,而不仅仅是一个?
- 29. 整个世界为什么翻译而不仅仅是对象?
- 30. 如何扩展一个类的边界而不是其他类
的目的是为了避免重复的代码。并访问所提到的类的所有方法。 –