请教C# 继承机制
我用的是PHP进行开发的,最近在学习C#,不过看到C#的继承有些奇怪。基类和子类多定义了相同的属性,基类定义了一个方法,但为什么总是取得基类的属性值呢?子类同名属性并没有覆盖掉基类的?
class Base{
属性1 = 10
方法(用来取得属性1)
}
class Child : Base
{
属性1 = 20
}
Child a = new Child();
a.方法() //C#输出10,如果是PHP会输出20的 --------------------编程问答--------------------
using System;--------------------编程问答-------------------- 也就是说,如果没有使用new,那么一旦出现同名的属性或方法,默认都是基类覆盖子类? --------------------编程问答-------------------- 看来C#是采用隐藏的方式啊
class Base
{
protected int 属性1 = 10;
protected virtual void 方法()
{
Console.WriteLine(属性1);
}
}
class Child : Base
{
new int 属性1 = 20;
static void Main()
{
Child a = new Child();
a.方法();
Console.WriteLine(a.属性1);
}
}
/*
输出:
10
20
*/
而PHP是覆盖啊 --------------------编程问答-------------------- using System;
namespace jicheng
{
class Base
{
int i = 10;
protected virtual void display()
{
Console.WriteLine("i = {0}", i);
}
}
class Program : Base
{
int i = 20;
protected override void display()
{
Console.WriteLine("i = {0}" , i);
}
static void Main()
{
Program p = new Program();
p.display();
Console.Read();
}
}
} --------------------编程问答-------------------- 上面的输出是i = 20。刚刚运行过的
刚刚学过C#继承不久,也是半桶水,有很多不懂的 --------------------编程问答-------------------- C#中,如果继承类与基类有同样名称的属性,有两种选择:第一,声明修饰符new,表示这是一个新的属性,与基类的同名属性不是同一个,这样等于是添加了一个新的属性。还有一种是用修饰符override,这时就表示覆盖积累的属性。如果不用任何修饰符,则默认为new。
因此,只有你没有声明修饰符或者用了new的情况下,才会出现你所说的问题。如果用了override,就不会出现这个问题。
至于用了override之后,在类型转换之后为何会出现这种奇妙的效果,你需要参考更深层次的资料,new与override的不同在于他们对“函数入口地址表”所作的操作有关(C#里面的属性实际上就是函数)。如果实在看不懂那些解释,就背会这个规律就可以了。 --------------------编程问答-------------------- 会不会是这样一种情况:
当代码如一楼的hgaoping那样时,继承类中没有声明新的方法。
所以,当a.方法()时,调用的是基类中的方法,那么自然其中的属性1指的也是基类中的属性1。
而当代码如四楼xj004xf008那样时,继承类中的方法采用override覆盖了基类中的方法。
所以,当p.display()时,其中的i就变成了继承类中的i。 --------------------编程问答-------------------- 我还想问一下,属性修饰为new和修饰为override具体的不同在哪里?
是不是说如果一个继承类中的属性被修饰为override,那么,当调用父类中的同名属性时,其实是继承类中的属性被调用?
而如果这个属性被修饰为new,那么,"父类.属性"就是调用父类中的属性,而"继承类.属性"就是调用继承类中的属性?
这样理解正确么? --------------------编程问答-------------------- 一个是创建一个新的,同名的字段,但是属于不同的类。
而override则覆盖之
补充:.NET技术 , C#