当前位置:编程学习 > C#/ASP.NET >>

请教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;

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
*/
--------------------编程问答-------------------- 也就是说,如果没有使用new,那么一旦出现同名的属性或方法,默认都是基类覆盖子类? --------------------编程问答-------------------- 看来C#是采用隐藏的方式啊

而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#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,