C#和PHP OOP的区别

Das*_*alo 2 php c# oop

我有一个普遍的OOP问题.

如果我在C#中有以下类

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();
Run Code Online (Sandbox Code Playgroud)

代码输出'Parent'.据我所知,这是因为这指向了Parent对象,对吗?

如果我在PHP5中也这样做:

class ParentClass {
public $val = 'parent';

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

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

$a = new ChildClass();
$a->foo();
Run Code Online (Sandbox Code Playgroud)

结果将是'孩子'.

虽然我改变了

public $val = 'parent'; 
Run Code Online (Sandbox Code Playgroud)

private $val = 'parent';
Run Code Online (Sandbox Code Playgroud)

然后PHP也会显示'父'.C#始终使用公共和私有访问修饰符返回"父".

这有什么理由吗?哪种行为是正确的?

任何有用的阅读链接将非常感谢!

谢谢!

Rob*_*vey 6

在您声明的方案中没有正确或不正确的行为.语言设计师做了对他们有意义的事情.

你没有在c#中获得预期行为的原因是因为在Parent类中调用了GetValue,其中"this"表示父val.

要获得正确的行为,您可以在Child类中包含相同的方法,并使用以下override关键字:

public class Child
{
    public string val = "Child";
    public override void GetValue()
    {
        Console.WriteLine(val);
    }
}
Run Code Online (Sandbox Code Playgroud)

...将"Child"打印到控制台.

  • C#允许您覆盖只需要将变量标记为可覆盖的变量,并明确指定要覆盖它.它使基类可以更好地控制可以对其进行的修改. (3认同)