Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP类,继承,实现_Php - Fatal编程技术网

PHP类,继承,实现

PHP类,继承,实现,php,Php,我正在看罗伯特·皮特的答案 interface Weapons { public function Fire(); } class Colt implements Weapons { function Fire() { echo 'Fire!'; } } abstract class Human implements Colt { } class Sniper extends Human { public function __co

我正在看罗伯特·皮特的答案

interface Weapons {

    public function Fire();

}

class Colt implements Weapons {

    function Fire() {
        echo 'Fire!';
    }

}

abstract class Human implements Colt
{

}

class Sniper extends Human
{
    public function __construct()
    {

    }



}
在“人类”上,我可能要实现“武器”而不是柯尔特,然后在“狙击手”上初始化正确的武器类

class Sniper extends Human
{
public $weapon;

    public function __construct($weapon)
    {
    $this->weapon = new $weapon;  
    }


$this->weapon->fire();


}
或者类似的?我对它的工作原理感到困惑

EXAMPLE 1

class A {
public $class;

__construct() {
$this->class = new $class;
}

hello() {
$this->class->hello();
}
}

class B {
public function hello() {
echo 'hi';
}
}

这取决于你,你将如何设计你的类

如果我想成为一名游戏程序员,我可能会使用类似这样的东西(这是一个工作的小游戏!)


我会避免让人类类实现与武器有关的任何东西。实现定义类必须定义的方法,但不处理类的属性

对象接口允许您创建指定 类必须实现的方法,而不必定义这些方法是如何实现的 方法被处理。 ()


因此,狙击手是人(但拥有$wearm属性),柯尔特、火箭筒等都实现了武器接口(迫使他们定义fire()函数。

在我这方面,我会使用以下类:

Interface iWeapon {}
Interface iAttacker {}
Interface iAttackable {}

Class Human Implements iAttacker, iAttackable {}
Class RangedWeapon Implements iWeapon {}
Class Colt extends RangedWeapon {}
Class M4AA extends RangedWeapon {}
Class Sniper extends RangedWeapon {}
Class Shotgun extends RangedWeapon {}
现在让我解释一下:

iWeapon

描述一种武器、不同的getter、setter和一些动作,如DoDamage()或GetRandomAttackDamage()。如您所愿。此接口允许您定义武器的基本属性。您可以将其应用于武器类或派生它的任何其他类,但我会将其保留为至少一个基本类。此接口的目标是强制所有武器添加相同的行为,它有攻击伤害、射程,可能有弹药?(弹药)

iAttacker/iAttackable

描述可以攻击或被攻击的东西。这些接口通常提供确定攻击能力(是晕眩的、固定的、禁用的?)或被攻击能力(不可见的、不可战胜的?)的功能并提供攻击其他实现的功能。人类或任何其他生物都会实现这些功能,比如说,嘿,我可以攻击也可以被攻击。这个界面还将提供getter和setter来控制这些生物携带的武器,也许是盔甲,以防对它们造成伤害

关于接口

请记住,类代表一些相对具体的东西。如果您将类命名为“攻击者”或“目标”您可能忽略了类的要点。类和对象表示有形的东西。另一方面,接口表示类可以执行的操作或角色。它们只指定可以执行的操作,不提供实现本身,它们告诉对象将实现什么,从而声明它们可以执行的操作

希望这有帮助:)


关于属性的正确实现,我建议如下:

class Player implements iAttacker, iAttackable {
    protected $playerClass;
    protected $race;
    protected $weapon;
    protected $armor;

    public function setClass(playerClass $class){
         $this->playerClass = $class;
    }
    public function getClass(){
         return $this->playerClass;
    }

    public function setRace(race $race){
         $this->race = $race;
    }
    public function getRace(){
         return $this->race;
    }

    public function setWeapon(damagingGear $weapon){
         $this->weapon = $weapon;
    }
    public function getWeapon(){
         return $this->weapon;
    }

    public function setArmor(protectiveGear $armor){
         $this->armor = $armor;
    }
    public function getArmor(){
         return $this->armor;
    }

    public function attack(iAttackable $target){

        //Check we can attack
        if(!$this->canAttack()){ //Check we are not immobilized or disabled
            throw new CannotAttackException($this->getNonAttackingReason());
        }elseif(!$this->weapon->canFire()){
            throw new CannotAttackException($this->weapon->getNonFireableReason());
        }

        //We can attack, roll the damage
        if($target->isAttackable()){
            $target->sufferDamage($this->weapon->rollDamage()+$this->race->getRangedDamageBonus());
        }else{
            thrown new CannotBeAttackedException($target->getNonAttackableReason());
        }
    }

}

班级人力应
扩展
,而不是
实施
班级人力。因为这不是接口,这完全取决于你。如果你在一家有自己最佳实践清单的公司工作,那么你就会询问和阅读文件。但既然这是你的项目,就去做吧。最好的学习方法是犯错误。谢谢你给了我一个很好的例子,但我仍然不确定——如果我不知道什么是“种族”(人类、巨魔等)该怎么办。但是我需要从数据库中提取,扩展到一个变量,这是行不通的:我想这更好用,比如NPC(怪物,老鼠),而不是“用户”自己。真的谢谢你的帮助!它工作得很好,但我想,我仍然在考虑如何扩展更多的东西,例如,如果我有一个“汽车”类,我也想扩展它,但我想我不能扩展到一个以上的类?我想问题是我不明白如何扩展一个“动态”类,或者类似的。。这不是一种模式吗?狙击手可以延长一个人的生命,但也可以延长一个人的生命Troll@John:不,不幸的是你不能。但你们可以在战斗中使用汽车,或者不使用?@约翰:有一些解决办法,但我认为你们不需要它。你怎么想?
类人类{}类狙击手扩展人类{public$wearm}
我不喜欢这样。我认为$wearm是每个人的财产,因此应该属于人类的类别。这可能是,忽略了这样一句话的政治含义:),我是在讨论实现,而不是财产继承。如果你的人类都有武器,那么无论如何,在父类中声明它。现在我们知道GTA Vice City中的“格斗”是做什么的了….=)“RangedWeapon”应该包含什么内容?=)远程武器功能的基本实现,如界面中所述。那么,每种武器都可以但不必扩展射程武器。在这一点上,这是一个品味的问题,你只想要“武器”、“远程武器/近战武器”吗?这是一个非常大的话题:)是的,我现在要继续讲“远程武器,近战武器”。。我在考虑属性,如果我在类中声明一个类,这不意味着我需要在类中设置一个方法来执行它吗?类a为一个对象设置一个var,然后在类b中设置一个名为hello()的方法现在我需要设置一个“hello”方法,然后像var->func()一样放置,对吗?(更新了我的问题,以显示我的意思)看看我补充的内容,我花了一些时间才弄清楚,但我认为这应该会引导你走向我认为是正确的方向。。。
Interface iWeapon {}
Interface iAttacker {}
Interface iAttackable {}

Class Human Implements iAttacker, iAttackable {}
Class RangedWeapon Implements iWeapon {}
Class Colt extends RangedWeapon {}
Class M4AA extends RangedWeapon {}
Class Sniper extends RangedWeapon {}
Class Shotgun extends RangedWeapon {}
class Player implements iAttacker, iAttackable {
    protected $playerClass;
    protected $race;
    protected $weapon;
    protected $armor;

    public function setClass(playerClass $class){
         $this->playerClass = $class;
    }
    public function getClass(){
         return $this->playerClass;
    }

    public function setRace(race $race){
         $this->race = $race;
    }
    public function getRace(){
         return $this->race;
    }

    public function setWeapon(damagingGear $weapon){
         $this->weapon = $weapon;
    }
    public function getWeapon(){
         return $this->weapon;
    }

    public function setArmor(protectiveGear $armor){
         $this->armor = $armor;
    }
    public function getArmor(){
         return $this->armor;
    }

    public function attack(iAttackable $target){

        //Check we can attack
        if(!$this->canAttack()){ //Check we are not immobilized or disabled
            throw new CannotAttackException($this->getNonAttackingReason());
        }elseif(!$this->weapon->canFire()){
            throw new CannotAttackException($this->weapon->getNonFireableReason());
        }

        //We can attack, roll the damage
        if($target->isAttackable()){
            $target->sufferDamage($this->weapon->rollDamage()+$this->race->getRangedDamageBonus());
        }else{
            thrown new CannotBeAttackedException($target->getNonAttackableReason());
        }
    }

}