2017-07-09 8 views
0

私はC#の世界を探索しようとしていますが、現在はPHPを使って作業しています。私は抽象クラスの実装をシャープに理解しようとしていました。両方の言語の振る舞いに変動があります。そのため、私はC#で抽象クラスの実装をよりよく理解できるようにここに投稿しています。c#とphpの抽象クラスの実装の相違

PHPとC#の両方が抽象クラスを継承しています。つまり、抽象クラスから継承するすべてのクラスは、抽象クラスを継承するだけでなく、抽象メソッドを実装する必要があります。

この問題は、抽象クラスのメソッドから子クラスのプロパティにアクセスする際に発生します。 PHP getHairColor()では、パブリックヘアプロパティにアクセスできます。しかし、C#getHairColor()は、抽象クラスから継承しているクラスのpublic hairプロパティにはアクセスできません。

私はMaleクラスがPersonクラスを継承しているので、親クラスからgetHairColor()メソッドも継承しているので、hairプロパティにアクセスできるはずです。 PHPの実装はC#よりも意味があります。 2つの異なる言語で類似した概念の異なる動作について適切な説明を得ることはできますか?

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

いいえ、あなたが定義するプロパティを子供は親からアクセスできません。すべての人が髪を持っているならば、人の中に「髪」を定義するのはどうですか? – oerkelens

+1

'Person'を拡張し、' hair'を定義しないと、PHPで何が起こるでしょうか? –

+0

しかし、それは抽象クラスから拡張されています。getHairColorは子クラスの継承されたメソッドです。そのため、私はそれがhairプロパティにアクセスする必要があると思います。したがって、どの言語がabstractクラスのコンセプトの実装に関してより論理的です。 –

答えて

1

C#は静的型付けを有します。そのため、サブクラスで宣言されているフィールドやプロパティにはアクセスできません。

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

ます。また、プロパティ Hairのセッターとして SetHairColorを実装することができます:あなたは Personで抽象プロパティとして 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

お返事ありがとうございます。静的な入力という用語を述べました。しかし、この動作のために静的型付けが何をしなければならないか説明できますか? –

+0

_static typing_という一般的な説明については、https://csharp.2000things.com/tag/static-typing/またはhttp://www.alorelang.org/doc/typeoverviewを参照してください。 .html –

+0

C#はコンパイル時に解決できる参照のみを受け入れます。フィールド 'hair'が抽象クラスで宣言されていない場合、コンパイラは可能なすべてのサブクラスに 'hair'というフィールドがあることをどのように知るべきですか?フィールド 'hair'を持たない' BaldHead'というサブクラスをどこかで定義するかもしれません。しかし、「Person」に抽象プロパティ「Hair」を宣言すると、すべてのサブクラスがそのようなプロパティを実装することが保証されます。動的な型指定の言語では、これは実行時にチェックされ、 'BaldHead'の髪にアクセスしようとすると、ランタイムエラーが発生します。 –

関連する問題