2017-07-09 1 views
0

Je travaille avec PHP depuis un moment maintenant j'essaie d'explorer le monde de C#. J'essayais de comprendre la mise en œuvre de la classe abstraite en c sharp.J'ai trouvé une certaine fluctuation dans le comportement dans les deux langues. C'est pourquoi je l'affiche ici afin que je puisse avoir une meilleure idée de la mise en œuvre de la classe abstraite en C#.Différence dans la mise en œuvre de la classe abstraite en C# et php

PHP et C# étendent la classe abstraite. Cela signifie que toute la classe qui s'étend de la classe abstraite doit implémenter les méthodes abstraites et hériter des méthodes publiques non abstraites de la classe abstraite.

Le problème se pose lors de l'accès à la propriété de la classe enfant à partir d'une méthode de la classe abstraite. En PHP getHairColor() peut accéder à la propriété de cheveux publics. Mais en C# getHairColor() ne peut pas accéder à la propriété de cheveux publics de la classe qui s'étend de la classe abstraite.

Je pense que la classe Male étend la classe Person, elle hérite également de la méthode getHairColor() de la classe parente. Ainsi, elle devrait pouvoir accéder à la propriété hair. Ici, l'implémentation PHP a plus de sens que C#. Puis-je obtenir une explication appropriée pour un comportement différent pour un concept similaire dans deux langues différentes?

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

Non, les propriétés que vous définissez dans les enfants ne sont pas accessibles depuis le parent. Si tous les 'Person's ont des cheveux, pourquoi ne pas définir' hair' dans 'Person'? – oerkelens

+1

Que se passera-t-il en PHP si vous étendez 'Person' et ne définissez pas' hair'? –

+0

Mais il s'étend de la classe abstraite. Donc getHairColor est une méthode héritée pour la classe enfant.C'est pourquoi je pense qu'il devrait accéder à la propriété de cheveux.Ainsi, quel langage est plus logique concernant la mise en œuvre du concept de classe abstraite. –

Répondre

1

C# a typage statique. C'est pourquoi vous ne pouvez pas accéder à un champ ou une propriété déclarée dans une sous-classe. Vous devez déclarer Hair comme une propriété abstraite Person et mettre en œuvre dans la sous-classe:

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; 
     } 
    } 

Vous pouvez également mettre en œuvre SetHairColor comme setter de la propriété Hair:

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

merci pour votre réponse. Vous avez mentionné le terme typage statique. Mais pouvez-vous expliquer ce que le typage statique doit faire pour ce comportement? –

+0

Pour une explication générale du terme _static_typing_, vous pouvez consulter ceci: https://csharp.2000things.com/tag/static-typing/, ou ceci: http://www.alorelang.org/doc/typeoverview .html –

+0

C# n'accepte que les références qui peuvent être résolues lors de la compilation. Si le champ 'hair' n'est pas déclaré dans la classe abstraite, comment le compilateur devrait-il savoir qu'il y a un champ' hair' dans toutes les sous-classes possibles? Vous pourriez quelque part définir une sous-classe 'BaldHead' qui n'a pas de champ' hair'. Mais déclarer une propriété abstraite 'Hair' dans' Person' garantit que toutes les sous-catégories implémentent une telle propriété. Dans les langages avec typage dynamique, ceci serait vérifié lors de l'exécution, et si vous essayiez d'accéder aux cheveux d'un 'BaldHead', vous obtiendriez une erreur d'exécution. –