簡體   English   中英

C#和PHP中抽象類實現的區別

[英]Difference in abstract class implementation in c# and php

我使用PHP已有一段時間了,我試圖探索c#的世界,試圖了解c Sharp中的抽象類實現,發現兩種語言的行為都有波動,這就是為什么將其發布在此處,以便我可以更好地了解C#中的抽象類實現。

PHP和C#都擴展了抽象類,這意味着從抽象類擴展的所有類都必須實現抽象方法,並從抽象類繼承非抽象的公共方法。

從抽象類的方法訪問子類的屬性時會出現問題。 在PHP中, getHairColor()可以訪問public hair屬性。 但是在C#中, getHairColor()無法訪問從抽象類擴展的類的public hair屬性。

我認為隨着Male類擴展Person類,它也繼承了getHairColor()類的getHairColor()方法,因此它應該能夠訪問hair屬性。 在這里,PHP實現比C#更有意義。 我可以用兩種不同的語言針對相似概念的不同行為獲得正確的解釋嗎?

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 

C#具有靜態類型。 這就是為什么您不能訪問在子類中聲明的字段或屬性的原因。 您必須在Person中將Hair聲明為抽象屬性,並在子類中實現它:

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

您還可以實現SetHairColor作為屬性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 }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM