面向对象-多态 附抽象

面向对象有三大特征:继承,封装,多态。
什么是多态?
多态就是对象可以表现多个类型的能力
实现多态有三种手段:
1、虚方法
2、抽象类
3、接口
一、虚方法
看一段代码

namespace 多态
{
    public class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person("人类");
            p.Show();
            Chinese china = new Chinese("中国人");
            p.Show();
            Console.ReadKey();
        }
    }
    public class Person
    {
        public string Name { get; set; }

        public Person(string name)
        {
            this.Name = name;
        }
        public void Show()
        {
            Console.WriteLine("我叫{0}", this.Name);
        }
    }

    public class Chinese : Person
    {
        public Chinese(string name)
            : base(name)
        {
        }
        public void Show()
        {
            Console.WriteLine("我叫{0}",base.Name);
        }
    }

    public class Japanese : Person
    {
        public Japanese(string name)
            : base(name)
        { }
        public void Show()
        {
            Console.WriteLine("我是{0}",base.Name);
        }
    }
}

可以发现其中的方法名字跟父类的名字一样。运行的时候发现子类方法报绿线错误,
如果子类的方法跟子类的方法名相同,那么子类会默认的将父类的方法隐藏掉,解决方法有两种
1.new关键字

1).new的作用:隐藏子类从父类继承过来的方法。

//子类的类
  public class Japanese : Person
    {
        public Japanese(string name)
            : base(name)
        { }
//方法这里加一个new关键字
        public new void Show()
        {
            Console.WriteLine("我是{0}",base.Name);
        }
    }

2。使用虚方法
1)、将父类的方法标记为virtual 表示这个父类的方法可以被子类重写

//父类的方法
 public class Person
    {
        public string Name
        {
            get;
            set;
        }
        public Person(string name)
        {
            this.Name = name;
        }
//父类的方法加virtual 
        public virtual void SayHello()
        {
            Console.WriteLine("大家好,我叫{0},我是人类", this.Name);
        }
    }

2)、将子类的方法标记为override  表示重写父类的方法

//子类的方法
 public class Chinese : Person
    {
        public Chinese(string name)
            : base(name)
        {

        }
//子类的方法中加override 实现虚方法
        public override void SayHello()
        {
            Console.WriteLine("大家好,我叫{0},我是中国人", this.Name);
        }
    }

虚方法与重写
1、方法不能用static修饰
2、方法重写与基类的签名必须一致
3、virtual不能与private一起使用
4.虚方法为什么不能加static因为 虚方法是父类,加static,那么就是类调用这个方法,和对象无关了,那子类就调不了.

常见虚方法:Equal()ToString()GetHashCode()
override与重载(overload)的区别 
重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要。重载(overload)是面向过程的概念。Override 是进行基类中函数的重写。Override是面向对象的概念
二、抽象类抽象类与抽象方法由abstract修饰abstract的使用注意1,抽象方法没有方法体2.抽象成员只能存在于3.抽象类中抽象类可以有非抽象成员4.抽象类的派生类必须实现抽象方法体5.抽用作基类,无法实例化

posted @ 2013-07-06 17:35  知识青年下乡去  阅读(531)  评论(4编辑  收藏  举报