C # ve PHP OOP farkı

3 Cevap

Ben bir genel OOP soru var.

Ben C # aşağıdaki sınıfları varsa

class Parent
{
    public string val = "Parent";

    public void getValue()
    {
        Console.WriteLine(this.val);
    }
}

class Child:Parent
{
    public string val = "Child";
}

Child child = new Child();
child.getValue();

Kod çıktısı: 'Ana'. Ben bu Veli nesneye işaret çünkü, değil anladığım kadarıyla?

Ben PHP5'ta aynı yaparsanız:

class ParentClass {
public $val = 'parent';

    public function foo()
    {
        echo $this->val;
    }
}

class ChildClass extends ParentClass {
public $val = 'child';
}

$a = new ChildClass();
$a->foo();

Sonuç 'çocuk' olacak.

Rağmen değiştirirsem

public $val = 'parent';

karşı

private $val = 'parent';

Daha sonra PHP 'üst' gösterecektir. C #, her zaman kamu hem de özel erişim değiştiricileri ile 'üst' dönün.

Bunun için herhangi bir neden var mı? Ve hangi davranış doğrudur?

Any useful links karşı read will be highly appreciated!

Teşekkür ederiz!

3 Cevap

Sizin belirtilen senaryolarda hiçbir doğru veya yanlış davranış yoktur. Dil tasarımcıları onlara mantıklı şeyi yaptım.

GetValue ", bu" ana val anlamına Ana sınıfı olarak adlandırılan ediliyor çünkü c # beklenen davranış alamadım nedenidir.

Doğru davranış almak için override anahtar kelime ile Çocuk sınıfında aynı yöntemi, şunlardır:

public class Child
{
    public string val = "Child";
    public override void GetValue()
    {
        Console.WriteLine(val);
    }
}

Konsola "Çocuk" yazdırmak istiyorum ... hangi.

Ben diğer OOP dillerde mevcut kılma veya sanal nitelemeler kullanmak değil çünkü PHP OOP bu şekilde davrandığını düşünüyorum. Benim tahminim PHP nasıl çalıştığını bir sınırlama ya da bir olurdu, ya da sadece kolayca önlenebilecek bir şey yazmak için çok fazla zaman aldı.

Burada C # benzer sonuçlar elde ediyorum nasıl:

class Parent
{
    // Public identifiers cannot be overridden in C#
    private string _val = "Parent";
    // Public properties can.
    public virtual string val
    {
        get { return _val; }
    }

    public void getValue()
    {
        Console.WriteLine(this.val);
    }
}

class Child : Parent
{
    private string _val = "Child";
    public virtual string val
    {
        get { return _val; }
    }
}

PHP'nin ifadesi çalışma zamanı kadar değerlendirilir, bu nedenle türetilen sınıfın nesnesini kullanmak için mantıklı değil. Bununla birlikte, C # 'ın ifadesi derleme zamanında değerlendirilir. Bir temel sınıf işlevi geçersiz olup olmadığını hiç bir fikrim var, bu yüzden bilen dize referans olacaktır.

Sanal anahtar kelime, bu geçersiz kılınmasını beklemek derleyici söylemek fonksiyonları için gelir orası. Bu vtable işlevini bakacağız. Ama veriler için buna eşdeğer yoktur.

Ancak, sanal bir özellik haline yapabilir ve size beklediğiniz davranış olurdu. Özellikleri kılık değiştirmiş fonksiyonlar oldukları vtable kullanın.

Burada PHP etkiyi elde etmek için kod.

class Parent{    
    public virtual string val 
    {
        get { return "Parent"; }
    }

    public void getValue()    
    {        
        Console.WriteLine(this.val);    
    }
}

class Child:Parent
{
    public override string val
    {
        get { return "Child"; }
    }
}