she3p
0
Guten Morgen
Ich bin gerade über ein, meiner Meinung nach, etwas seltsames Verhalten der gängigen OOP-Implementation gestolpert. Es handelt sich um die Sichtbarkeit von privaten Properties einer Klasse.
Ich war der Meinung, falls eine Eigenschaft als privat deklariert wurde, sollte dies auch in jedem Kontext eingehalten werden. Doch wurde ich eines besseren belehrt.
Nun, das einfachste ist wohl ein Beispiel (in PHP, Java scheint sich gleich zu verhalten).
Nun wie man sieht ist für das Objekt meep das private Property $a der Klasse SomethingOther nicht sichtbar. Soweit so gut.
Falls jedoch ein Objekt auf eine private Eigenschaft eines Objekts derselben Instanz zugreifen will, so funktioniert das.
Dies obwohl wir uns in $meep definitiv in einem "äusseren" Kontext (im Bezug auf das Objekt $asdf) befinden.
Nun, auf die Frage: "Wie konnte ich mit meinem Verständnis nur so falsch liegen?" werde ich wohl nie eine Antwort finden. Doch hoffe ich ihr könnt mir sagen, warum dieses Verhalten Sinn macht - und vor allem: Ist das wirklich keine Verletzung der allgemeinen OOP-Spezifikation?
Ich danke im Voraus.
sheeep
Edit:
Ich bin gerade über ein, meiner Meinung nach, etwas seltsames Verhalten der gängigen OOP-Implementation gestolpert. Es handelt sich um die Sichtbarkeit von privaten Properties einer Klasse.
Ich war der Meinung, falls eine Eigenschaft als privat deklariert wurde, sollte dies auch in jedem Kontext eingehalten werden. Doch wurde ich eines besseren belehrt.
Nun, das einfachste ist wohl ein Beispiel (in PHP, Java scheint sich gleich zu verhalten).
PHP:
<?php
class Something
{
private $x;
public function __construct()
{
$this->x = 1;
}
public function foo(Something $bar)
{
echo $bar->x;
}
public function bar(SomethingOther $foo)
{
echo $foo->a;
}
}
class SomethingOther
{
private $a;
public function __construct()
{
$this->a = 1;
}
}
$meep = new Something();
$asdf = new Something();
$qwer = new SomethingOther();
//will throw a fatal
$meep->bar($qwer);
//will output: 1
$meep->foo($asdf);
?>
Falls jedoch ein Objekt auf eine private Eigenschaft eines Objekts derselben Instanz zugreifen will, so funktioniert das.
Dies obwohl wir uns in $meep definitiv in einem "äusseren" Kontext (im Bezug auf das Objekt $asdf) befinden.
Nun, auf die Frage: "Wie konnte ich mit meinem Verständnis nur so falsch liegen?" werde ich wohl nie eine Antwort finden. Doch hoffe ich ihr könnt mir sagen, warum dieses Verhalten Sinn macht - und vor allem: Ist das wirklich keine Verletzung der allgemeinen OOP-Spezifikation?
Ich danke im Voraus.
sheeep
Edit:
Code:
#include <stdio.h>
using namespace std;
class Something
{
private:
int x;
public:
Something();
void foo(Something &b);
};
Something::Something()
{
this->x = 1;
}
void Something::foo(Something &b)
{
printf("%d\n", b.x);
}
int main( int argc, const char* argv[] )
{
Something a = Something();
Something b = Something();
a.foo(b);
}
Zuletzt bearbeitet: