繁体   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