【问题标题】:What is the difference of abstract class and non-abstract class when inheriting继承时抽象类和非抽象类有什么区别
【发布时间】:2013-10-09 09:02:17
【问题描述】:

我已经搜索了几个小时在 php 中使用抽象类而不是非抽象类的优势。我知道抽象类不能被实例化,这是单例设计模式的一个很好的特点。但我的观点是,既然它们都可以作为基类,那么还有其他理由使用抽象类吗?我发现像What are the advantage if i use abstract class in php? 这样的所有答案都没有提到这一点,他们只是回答了另一个问题,即使用基类有什么好处? 所以,我的问题是,除了不能实例化之外,还有什么理由使用抽象基类而不是普通基类?

【问题讨论】:

  • "抽象类不能被实例化,这是单例设计模式的一个很好的特点" 一个没什么关系,请read about software design patterns
  • 以后能否以您希望的任何方式实现这些方法?
  • 这在很大程度上取决于您如何设计应用程序,没有“这总是更好”的规则。有时你最好使用一个,有时另一个

标签: php class inheritance abstract


【解决方案1】:

抽象类不能直接实例化,但它可以包含抽象方法和非抽象方法。

如果你扩展一个抽象类,你必须要么实现它的所有抽象函数,要么让子类抽象。

您不能覆盖常规方法并使其抽象,但您必须(最终)覆盖所有抽象方法并使其非抽象。

抽象关键字用于将类或方法标记为模式。它类似于接口,但可以包含变量和方法的实现。

关于抽象类有很多误解。这是一个抽象 Dog 类的示例。如果开发人员想为其他开发人员或自己创建一些基本的 Dog 类来扩展,他将类声明为抽象类。您不能直接实例化 Dog 类(没有人可以),但您可以通过自己的类扩展 Dog。 SmartDog 扩展了 Dog 等。

所有被 Dog 类声明为抽象的方法必须在每个扩展 Dog 的类中手动实现。

例如,抽象class Dog 有一个抽象方法Dog::Bark()。但是所有的狗叫声都不一样。因此,在每个 Dog 子类中,您必须具体描述狗如何吠叫,因此您必须定义例如 SmartDog::Bark()

【讨论】:

  • 即使您正在为SmartDog::Bark() 实现自己的逻辑,Dog::Bark() 中的逻辑是否仍然存在。我的意思是,如果一只狗用嘴吠叫,并且它在Dog::Bark() 中实现,你是否需要重新声明狗用嘴在SmartDog::Bark() 中吠叫的逻辑,否则它会留下来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2016-05-08
  • 2017-03-30
相关资源
最近更新 更多