当前位置: 首页 > 知识库问答 >
问题:

在子类的超级类中设置私有属性

诸葛砚
2023-03-14

我有以下课程

    < li >抽象类duck
    此类具有< code>flyBehavoir类型的< code>FlyBehavoir
    函数,以执行flying < code > preformFly() < br >函数来设置< code > flyBehavoir < code > setFlyBrhavoir(flyBehavoir$flyBehavoir) < li >类DonaldDuck扩展Duck
    在此类中,我有一个< code>__construct方法,在此构造函数中,我实例化了新的飞行行为< code>FlyWithWings。

问题是当我需要通过 setFlyBrhavoir() 方法在运行时更改 flyBehavoir 并将其设置为 FlyWithRocket 时,只要 flyBehavoir 是私有的,如果我将其公开,它就不会改变它工作正常。我该怎么做?

我们可以从子类更改超类中的任何属性,只要我访问这个私有属性vis setter。

在我的尝试之下

 <?php

//abstract class that defines what it takes to be a duck
//inside Duck we will have $flyBehavoir object of FlyBehavoir Type 
abstract class Duck{
    private  $flyBehavoir; 

    public function preformFly(){
        $flyBehavoir.fly();
    }
    public function setFlyBehavoir(FlyBehavoir $flyBehavoir){
        $this->flyBehavoir =  $flyBehavoir;
    }
}

//creating type FlyBehavoir 
interface FlyBehavoir{
    function fly();
}

//this concrete class of type FlyBehavoir  this will provide our ducks with the functionality they need to fly
class FlyWithWings implements FlyBehavoir{
    public function fly(){
        echo "I am Flying with my own Wings<br>";
    }
}

//this concrete class of type FlyBehavoir  this will provide our ducks with the functionality they need to fly
class FlyWithRocket implements FlyBehavoir{
    public function fly(){
        echo "I am the fastest duck ever, see my rockets wings <br>";
    }
}


// creating our first duck and given it the ability to fly with wings
class DonaldDuck extends Duck{

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

}


$donaldDuck = new DonaldDuck( ) ;

$donaldDuck->flyBehavoir->fly();
//changing behavoir in run time 
$donaldDuck->setFlyBehavoir(new FlyWithRocket);
$donaldDuck->flyBehavoir->fly();


Output
I am Flying with my own Wings
I am Flying with my own Wings

共有1个答案

盛骏祥
2023-03-14

在子类中不能访问< code>private属性。

class DonaldDuck extends Duck {
    public function __construct(){
        $this->flyBehavoir = new FlyWithWings;
    }
}

出于所有意图和目的,这个类根本没有正式声明flyBe的,所以$this-

object(DonaldDuck)#1 (2) {
  ["flyBehavoir":"Duck":private]=>
  NULL
  ["flyBehavoir"]=>
  object(FlyWithWings)#2 (0) {
  }
}

父对象的< code>private属性是a)独立的,b)对它是< code >私有的, c)< code > null ,因为还没有人设置它。否则您也不可能访问< code>$donaldDuck-

如果您有一个私有属性,您只需要让同一类的代码作用于它:

class DonaldDuck extends Duck {
    public function __construct(){
        $this->setFlyBehaviour(new FlyWithWings);
    }
}

$donaldDuck = new DonaldDuck();
$donaldDuck->setFlyBehavoir(new FlyWithRocket);
$donaldDuck->preformFly();

这符合预期,因为你使用的是正确特权的方法来访问属性。如果要直接在子类中访问该属性,则需要对其进行保护(但是,这不会允许您从类外部访问它,它必须是公共的)。

 类似资料:
  • 问题内容: 我在使用Python super()和继承和属性时遇到了一个非常奇怪的问题。一,代码: 这很好。但是,我想要的(对我来说似乎是Pythonic) 即使不起作用 得到很好的价值。在这种情况下,x是同时定义了fset和fget的超类的属性。那为什么不起作用呢? 问题答案: 我试图找到正确的语言来支持这种行为的原由,以免给您一个“因为它就是”答案……但是似乎这个问题已经被问了不止一次了,并且

  • 问题内容: 是否可以在ES6类中创建私有属性? 这是一个例子。如何防止访问? 问题答案: 专用字段(和方法)正在ECMA标准中实现。您可以立即从[babel 7和Stage3预设开始使用它们。

  • 我如何在log4j2中做到这一点?注我仍然需要使用新的属性文件(不是xml或json)。 TIA

  • 在 Python 的面向对象编程中,私有属性是只能在类的实例方法中访问的属性,不允许在外界访问私有属性。 1. 私有属性的定义 1.1 定义 在属性名称前加上前缀 __,表示该属性为私有属性,示例代码如下: class Object: def method(self): self.__private_attribute = 123 在第 3 行,创建一个私有属性 __pr

  • 我有一份抽象的课堂报告: 我需要强制所有子类填充此 surrogateId 属性。(如果子类未填充属性,则会出现编译错误) 我尝试使用 final 关键字来强制我在构造函数中引入此属性的值,但我必须手动生成构造函数而不是使用 Lombok,很多样板代码。有没有办法在不手动生成结构的情况下实现相同的期望。

  • 问题内容: 众所周知,私有字段不会在类之间继承。令我着迷的是它如何用于内部静态类。考虑以下代码: 您能否解释一下如何访问其他内部类的私有字段?如果合法,为什么只能通过“ super.XXX”构造实现? 问题答案: 内部类是Java的较晚入门。添加它们时,它们仅作为编译器扩展添加,对JVM不变。 语言规范指出,内部类被允许访问在其内声明的类的私有成员。包括其他内部类。 为了使其工作,编译器会生成桥接