2017-07-09 1 views
0

Ich arbeite seit einiger Zeit mit PHP Ich versuche, die Welt von C# zu erforschen. Ich habe versucht, die abstrakte Klassenimplementierung in cis zu verstehen. Ich habe gefunden etwas Fluktuation im Verhalten in beiden Sprachen. Deshalb poste ich es hier, um einen besseren Einblick in die abstrakte Klassenimplementierung in C# zu bekommen.Unterschied in der abstrakten Klassenimplementierung in C# und php

Sowohl PHP als auch C# erweitern die abstrakte Klasse. Das bedeutet, dass die gesamte Klasse, die von der abstrakten Klasse ausgeht, die abstrakten Methoden implementieren und nicht abstrakte öffentliche Methoden von der abstrakten Klasse erben muss.

Das Problem tritt beim Zugriff auf die Eigenschaft der untergeordneten Klasse von einer Methode der abstrakten Klasse. In PHP getHairColor() kann die öffentliche Haar-Eigenschaft zugreifen. Aber in C# getHairColor() kann nicht auf die öffentliche Haar-Eigenschaft der Klasse zugreifen, die sich von der abstrakten Klasse erstreckt.

Ich denke, wie die männliche Klasse erweitert Person Klasse, erbt auch die getHairColor() Methode von der Elternklasse.So sollte es in der Lage sein, auf die Haar-Eigenschaft zugreifen. Hier macht PHP-Implementierung mehr Sinn als C#. Kann ich ein anderes Verhalten für ein ähnliches Konzept in zwei verschiedenen Sprachen richtig erklären?

PHP:

abstract class Person{ 
    abstract public function setHairColor($color); 

    public function getHairColor(){ 
     return $this->hair; // $this->hair is accessible from here 
    } 
} 

class Male extends Person{ 
    public $hair; 

    public function setHairColor($color){ 
     $this->hair = $color; 
    } 

} 

$male1 = new Male(); 
$male1->setHairColor("black"); 
echo $male1->getHairColor(); // access hair property 

C#:

abstract class Person 
{ 
    public abstract void setHairColor(string hair); 

    public string getHairColor() 
    { 
     return this.hair; // this.hair is not accessible from here 
    } 

} 

class Male : Person 
{ 
    public string hair; 

    public override void setHairColor(string hair) 
    { 
     this.hair = hair; 
    } 
} 

Male male1 = new Male(); 
male1.setHairColor("black"); 
Console.WriteLine(male1.getHairColor()); // can not access hair property 
+0

Nein, Eigenschaften, die Sie definieren in:

abstract class Person { public abstract void SetHairColor(string hair); public abstract string Hair { get; } public string getHairColor() { return this.Hair; // now it is accessible } } class Male : Person { private string _Hair; public override string Hair { get { return _Hair; } } public override void SetHairColor(string hair) { this._Hair = hair; } } 

Sie können Hair auch SetHairColor als Setter der Eigenschaft implementieren Kinder sind nicht vom Elternteil erreichbar. Wenn alle 'Personen Haare haben, warum definierst du' Haare' nicht in 'Person'? – oerkelens

+1

Was passiert in PHP, wenn Sie "Person" erweitern und nicht "Haare" definieren? –

+0

Aber es erstreckt sich von der abstrakten Klasse.So getHairColor ist eine geerbte Methode für Kind-Klasse.Das ist der Grund, warum ich denke, es sollte Haar Eigentum zugreifen.So, welche Sprache ist logischer in Bezug auf die Umsetzung der abstrakten Klasse-Konzept. –

Antwort

1

C# statische Typisierung hat. Aus diesem Grund können Sie nicht auf ein Feld oder eine Eigenschaft zugreifen, das in einer Unterklasse deklariert ist. Sie haben in PersonHair als abstrakte Eigenschaft deklarieren und in der Unterklasse implementieren:

abstract class Person 
    { 
     public abstract string Hair { get; set; } 

     public string getHairColor() 
     { 
      return this.Hair; // now it is accessible 
     } 

    } 

    class Male : Person 
    { 
     private string _Hair; 
     public override string Hair 
     { 
      get { return _Hair; } 
      set { _Hair = value } 
     } 
    } 
+0

danke für Ihre Antwort. Sie haben den Begriff statische Typisierung erwähnt. Aber können Sie erklären, was das statische Tippen für dieses Verhalten zu tun hat? –

+0

Für eine allgemeine Erklärung des Begriffes _static typing_, könnten Sie sich dies ansehen: https://csharp.2000things.com/tag/static-typing/, oder dies: http://www.alorelang.org/doc/typeoverview .html –

+0

C# akzeptiert nur die Referenzen, die zur Kompilierungszeit aufgelöst werden können. Wenn das Feld "Haar" nicht in der abstrakten Klasse deklariert ist, wie sollte der Compiler wissen, dass in allen möglichen Unterklassen ein Feld "Haare" vorhanden ist? Sie könnten irgendwo eine Unterklasse 'BaldHead' definieren, die kein Feld' hair' hat. Eine abstrakte Eigenschaft 'Hair' in' Person' zu deklarieren stellt jedoch sicher, dass alle Unterklassen eine solche Eigenschaft implementieren. In Sprachen mit dynamischer Typisierung würde dies zur Laufzeit überprüft werden, und wenn Sie versuchen würden, auf das Haar eines 'BaldHead' zuzugreifen, würden Sie einen Laufzeitfehler erhalten. –

Verwandte Themen