我有以下课程
问题是当我需要通过 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
在子类中不能访问< 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不变。 语言规范指出,内部类被允许访问在其内声明的类的私有成员。包括其他内部类。 为了使其工作,编译器会生成桥接