abstract 抽象类
1.只定义(或部分定义)子类需要的方法,子类可以通过继承来具体实现抽象类中的方法。
2.抽象类不能被实例化只能被继承。
3.抽象类可以定义非抽象方法:
如果是public 可以被实例化的继承类直接访问,如果是protected,则需要被继承子类public后使用。
4.抽象类中的抽象方法:
如果是public,则继承类的实现方法只能是public;
如果是protected,则继承类的实现方法可以是public也可以是protected;
但是不能是private
/**
* Class A 抽象类
*/
abstract class A
{
// 抽象方法
abstract public function play();
// 非抽象方法
protected function play2() {
echo "抽象类的非抽象方法";
}
}
/**
* Class B 继承类
*/
class B extends A
{
// 实现抽象方法
public function play()
{
print_r("let me play ball\r\n");
}
// 如果父类是public则不需要此方法,直接使用即可。
public function play2()
{
parent::play2(); // TODO: Change the autogenerated stub
}
}
error_reporting(-1);
$oa = new B();
$oa->play();
interface 接口
- 接口不能被实例化,只能被继承;
- 接口只定义方法名称,不实现;
- 接口必须使用public修饰符
- 接口不能定义实例变量属性,只能使用常量。
- 实现接口类必须要实现接口定义的所有方法。
/**
* Interface A 接口类
*/
interface A
{
const CA = '接口只能定义常量不能定义实例变量';
public function in_func_A();
public function in_func_B();
}
// echo A::CA;
/**
* Class B 实现接口类,必须要实现接口的所有方法
*/
class B implements A
{
public function in_func_A()
{
// TODO: Implement in_func_A() method.
echo 'this is in_func_A' . "</br>";
}
public function in_func_B()
{
// TODO: Implement in_fun_B() method.
echo 'this is in_func_b' . "</br>";
}
}
$obj = new B();
$obj->in_func_A();
$obj->in_func_B();
- 实现接口类中所有方法的过程,和继承了一个仅有抽象方法的抽象类是一样的。
- 一个类可以继承一个父类的同时实现任意多个接口(注意顺序:先继承后实现,仅可单继承)
/**
* Interface A 接口类
*/
interface A
{
public function in_func_A();
}
/**
* Interface B 接口类
*/
interface B
{
public function in_func_B();
}
/**
* Class C 抽象类
*/
abstract class C
{
abstract function ab_func_C();
public function func_c_c()
{
echo '抽象类的非抽象方法' . "</br>";
}
}
/**
* Class D 继承类同时实现了多个接口类
*/
class D extends C implements A,B
{
public function in_func_A()
{
echo '我实现了接口类A的方法in_func_A()' . "</br>";
}
public function in_func_B()
{
echo '我实现了接口类B的方法in_func_B()' . "</br>";
}
public function ab_func_C()
{
echo '我继承了抽象类C的抽象方法ab_func_C' . "</br>";
}
}
$obj = new D();
$obj->in_func_A();
$obj->in_func_B();
$obj->ab_func_C();
$obj->func_c_c();
abstract和interface的区别
- 共同点
- 两者都是抽象类,都不能被实例化
- 接口实现类及抽象类的抽象方法都都必须要被实现。
- 不同点
- interface需要实现使用 implement,abstract 需要继承使用功能 extends
- 一个类可以实现多个interface但是只能继承一个abstract
- interface强调的是特定功能的定义实现(如定义游戏中英雄的操作按键为interface,每个英雄为去实现每个按键的招数和血量等属性),而abstract强调的是所属关系。对于既需要interface统一又需要一些缺省的方法或变量,则abstract就很适合,它更像是类与接口之间的桥梁
- 接口中的抽象方法前不用也不能加 abstract 关键字,默认隐式就是抽象方法,也不能加 final 关键字来防止抽象方法的继承。而抽象类中抽象方法前则必须加上 abstract 表示显示声明为抽象方法。
- 接口中的抽象方法默认是 public 的,也只能是 public 的,不能用 private , protected 修饰符修饰。而抽象类中的抽象方法则可以用 public , protected 来修饰,但不能用 private 。