【问题标题】:Analyze abstract class in php解析php中的抽象类
【发布时间】:2015-07-06 07:10:31
【问题描述】:

我对抽象类有点困惑!我已经阅读了更多在 stackoverflow 和另一个网站上写的帖子,但我不明白!所以我又看了一下我的书,但我也不明白。所以请逐步分析下面的代码:

提前致谢

<?php
abstract class AbstractClass
{
 abstract protected function getValue();
 public function printOut() {
 print $this->getValue();
 }
}
class ConcreteClass1 extends AbstractClass
{
 protected function getValue() {
 return "ConcreteClass1";
 }
}
class ConcreteClass2 extends AbstractClass
{
 protected function getValue() {
 return "ConcreteClass2";
 }
}
$class1 = new ConcreteClass1;
$class1->printOut();

$class2 = new ConcreteClass2;
$class2->printOut();
?>

【问题讨论】:

    标签: php class abstract


    【解决方案1】:

    根据定义

    '一个抽象类是一个被声明为抽象的类——它可能也可能 不包括抽象方法。抽象类不能被实例化, 但它们可以被子类化。抽象方法是一种方法 声明时没有实现”。

    如果定义了一个抽象类,您应该用另一个类扩展该类。 如果抽象类中有抽象方法,您应该将它们写在子类中以便实例化子类。

    与代码有关,这就是为什么当你实例化ConcreteClass时,getValue函数被'覆盖'到模式中,而对printOut方法的调用是来自父亲本身,因为它是已经写入并且没有被孩子覆盖。 (另请参阅该方法不是抽象的,这就是为什么您也可以从父类中使用它的原因)

    【讨论】:

    • 感谢您的精彩解释!但只有一件事!我们是否写“抽象受保护函数 getValue();”来说明这个函数不在这里(在父类中)。它属于扩展类。?!因此,每当我们从扩展类中调用“printOut”函数,并且该函数包含“print $this->getValue();”时,它应该在 AbstractClass 中搜索 getValue 函数,但因为我们编写了“abstract protected function getValue();”,它在扩展类中搜索它!我说的对吗?!
    • 如果子类没有实现类,则调用类时,通常是在去父类之后。如果您应用该逻辑,您将理解当 getValue 方法被覆盖时(在这种情况下,它必须否则您不能使用未实现抽象方法的类),当调用父亲的 printOut 时,它会自动返回孩子。希望对您有所帮助!
    【解决方案2】:

    您的代码是正确的。抽象类的意思是,当你不能创建它的实例时。你不能这样做:

    $abstract = new AbstractClass();
    

    【讨论】:

    • 谢谢,但……让我很困惑!也就是说,我们是否写了“抽象受保护函数 getValue();”来表示这个函数不在这里(在父类中)。它属于扩展类。?!因此,每当我们从扩展类中调用“printOut”函数,并且该函数包含“print $this->getValue();”时,它应该在 AbstractClass 中搜索 getValue 函数,但因为我们编写了“abstract protected function getValue();”,它在扩展类中搜索它!我说的对吗?!
    • 如果在子程序中定义'getValue()',你每次都会覆盖同名的父方法,即使它是抽象方法。声明的抽象方法只说开发人员,当他必须在孩子中定义具有相同名称和参数的方法时。具有抽象方法的抽象类与“接口”几乎相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多