嘿,我对PHP很有经验,但我不知道关键字摘要在面向对象编程时会做什么。任何人都可以用简单的英语解释它可以用于什么?
我会在什么情况下使用抽象关键字?它如何改变类/接口?
答案 0 :(得分:16)
(希望这很简单 - 我认为我不能做得更好^^)
abstract
类无法实例化:您只能创建另一个继承自abstract
类的类,并实例化该子类。
如果您将某些方法声明为abstract
,则必须在子类中定义这些方法,以使其成为可实现的。
答案 1 :(得分:7)
声明类抽象意味着它必须被子类化才能被使用。无法实例化抽象类。人们可以将其视为可能包含实现代码的扩展接口(而不是接口)。
通过声明方法abstract,可以强制子类实现该方法。
答案 2 :(得分:2)
上面提到了定义,现在我将尝试给你一个例子:
“abstract”确保您遵循特定的逻辑,例如票证的材料总是“纸”,或者信用卡必须始终有“代码”。 如果您在一家拥有严格标准化的大公司工作,或者您希望“强迫”您的开发人员遵循特定的结构,这一点很重要,因此他们的代码不会一团糟。
abstract class ticket{
public function material()
{
return 'Paper';
}
}
abstract class creditcard{
public function material()
{
return 'Plastic';
}
abstract function setCode(); // the ";" semicolon is important otherwise it will cause an error
}
class key extends ticket{
public function getMaterial()
{
return parent::material();
}
}
class anotherKey extends creditcard{
public function setCode($code)
{
$this->code = $code;
}
}
如果我们没有定义“setCode”方法,解析器将在“new anotherKey
”上返回错误
答案 3 :(得分:1)
抽象类用于实际的a-kind-of-model关系。这允许例如数据库驱动程序映射层次结构,其中旨在提供公共基类,实际驱动程序类的方法的签名。然后根据实际驱动程序类中的预定签名执行实现。
这是代码示例
<?php
abstract class AbstrakteKlasse {
public abstract function methode();
}
class ImplementierendeKlasse extends AbstrakteKlasse {
public function methode() {
print "ImplementierendeKlasse::methode() aufgerufen.\n";
}
}
$objekt = new ImplementierendeKlasse;
$objekt->methode();
?>
答案 4 :(得分:0)
虽然您无法实例化抽象类,但您可以声明可用于派生类的具体方法/属性/变量(在C#,AFAIK中)
class Program
{
static void Main(string[] args)
{
Dog a = new Dog();
//concrete properties and methods in abstract base class
//are available to derived class
a.Name = "SuperDog";
a.EatFood();
//And now calling Dog's method
a.Speak();
Console.WriteLine(a.GetType());
}
}
public abstract class Animal
{
public string Name { get; set; }
public void EatFood()
{
Console.WriteLine("Eating..");
}
}
public class Dog :Animal
{
public void Speak()
{
Console.WriteLine("Bow .. Bow");
}
}