私は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
いいえ、あなたが定義するプロパティを子供は親からアクセスできません。すべての人が髪を持っているならば、人の中に「髪」を定義するのはどうですか? – oerkelens
'Person'を拡張し、' hair'を定義しないと、PHPで何が起こるでしょうか? –
しかし、それは抽象クラスから拡張されています。getHairColorは子クラスの継承されたメソッドです。そのため、私はそれがhairプロパティにアクセスする必要があると思います。したがって、どの言語がabstractクラスのコンセプトの実装に関してより論理的です。 –