黑马程序员-- 继承

来源:互联网 发布:淘宝图片下载工具 编辑:程序博客网 时间:2024/04/29 19:09

------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------

 

C#支持class继承和接口继承,且支持class单继承,interface多继承,而由于interface中不能有任何实现代码,所以只是继承了函数签名。
结构不支持继承,但结构可以派生自一个或多个接口,Class可以派生自一个类和多个接口,接口可以派生自一个或者多个接口。
结构总是派生字System.ValueType,类总是派生字System.Object,一下是一个继承的例子:

    class Person
 
    {
        public void Eat()
 
        {
 
            Console.WriteLine("只要是个人,就都会吃东西...");
 
        }
 
    }
 
    class Man:Person
 
    {
 
        public void Mark()
 
        {
 
            Console.WriteLine("这个是男人");
 
        }
 
    }
 
    class Woman:Person
 
    {
 
        public void Mark()
 
        {
 
            Console.WriteLine("这个是女人");
 
        }
 
    }

在上面的例子中,Woman和Man都继承自Person,由于class总是继承自System.Object,所以Person省略了“:Object”

如若把一个方法用virtual关键字修饰,则该方法就是虚方法,可以在任何派生类中重写该方法,当然也可以有虚属性,例如:

    class BaseClass
 
    {
 
        public virtual void Say()
 
        {
 
            Console.WriteLine( "这是基类中的虚方法");       
 
        }
 
        private string str;
 
        public virtual string Str
 
        {
 
            get;
 
            set;
 
        }
 
    }
 
    class Class:BaseClass
 
    {
 
        public override void Say()
 
        {
 
            Console.WriteLine("这是派生类中的方法");
 
        }
 
    }

由上例中可以看到,重写方法用override关键字,但不能将其用于字段和static函数
PS:1.重写之后会默认调用重写之后的方法。2.虚方法不能私有

如若在基类和派生类中都申明了相同签名的方法,切不是virtual和override,派生类中的方法会隐藏基类中的方法,如:(可以用new关键字,不然会有警告)

    class BaseClass
 
    {
 
        public  void Say()
 
        {
 
            Console.WriteLine( "这是基类中的方法");       
 
        }
 
    }
 
    class Class:BaseClass
 
    {
 
        public new void Say()
 
        {
 
            Console.WriteLine("这是派生类中的方法");
 
        }
 
    }

但若实例化子类给父类的时候,父类会找不到子类中的同名方法。这点须特别注意