A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李正兴 初级黑马   /  2012-3-23 21:29  /  2670 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

黑马程序员--面向对象的关键技术
---------------------- <a href="http://net.itheima.com/" target="blank">Windows Phone 7手机开发</a>、<a href="http://net.itheima.com/" target="blank">.Net培训</a>、期待与您交流! ----------------------
对于一些C#的初学者,类似于面向对象中的多态、接口、抽象、不是能很好的理解,本帖只针对一些初学者对这几个概念不是很理解的人看,牛人请绕道额就不要浪费时间了哈!第一次发帖,不喜勿碰额!
我一个一个来就举一些简单易懂的例子!
一、多态
直接上例子:

using System;//包含基本类和基类
using System.Collections.Generic;//定义泛型集合的接口和类
using System.Linq;//支持语言集成查询
using System.Text;//包含用于字符编码等功能的对象

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            MyHobby[]hobbies=new MyHobby[4];
            hobbies[0] = new MyHobby();
            hobbies[1] = new Writing();
            hobbies[2] = new Programing();
            hobbies[3] = new Music();
            foreach(MyHobby obj in hobbies)
            {
                obj.Interest();
            }
            Console.ReadKey();
        }
    }
    /// <summary>
    /// 基类 MyHobby
    /// </summary>
    class MyHobby
    {
        public virtual void Interest()
        {
            Console.WriteLine("我的爱好是:");
        }
    }
    /// <summary>
    /// Writing 继承 MyHobby
    /// </summary>
    class Writing : MyHobby
    {
        public override void Interest()//重载方法Interest()
        {
            Console.WriteLine("写作");
        }
    }
    /// <summary>
    /// Programing 继承 MyHobby
    /// </summary>
    class Programing : MyHobby
    {
        public override void Interest()//重载方法Interest()
        {
            Console.WriteLine("编程");
        }
    }
    /// <summary>
    /// Music 继承 MyHobby
    /// </summary>
    class Music : MyHobby
    {
        public override void Interest()//重载方法Interest()
        {
            Console.WriteLine("音乐");
        }
    }

}


运行结果:

总结:思想是,从基类中派生出三个类,在这三个类中重载基类的方法,然后重新调用派生类中的方法。因为每一次重载的功能都不一样,所以就实现了多态!


二、接口(interface)
还是用一个例子来说明:
using System;//包含基本类和基类
using System.Collections.Generic;//定义泛型集合的接口和类
using System.Linq;//支持语言集成查询
using System.Text;//包含用于字符编码等功能的对象

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            UseInterface u = new UseInterface();//创建对象,调用方法
            u.SayHello();  
            Console.ReadKey();
        }
    }
    /// <summary>
    /// 定义了一个接口FirstInterface
    /// </summary>
    interface FirstInterface
    {
        string Name//定义了一个属性
        {
            get;
            set;
        }
        void SayHello();//关键定义了方法,但是没有方法体!
    }
    /// <summary>
    /// 既然已经继承了接口,那必须要实现接口中的全部属性,方法等,缺一不可,
    /// 例如如果不实现Name属性,程序就会报错!
    /// </summary>
    class UseInterface : FirstInterface
    {
        string name = "我的名字叫龙腾!";

        public string Name//重新实现接口中的属性
        {
            get { return name; }
            set { name = value; }
        }
        /// <summary>
        /// 实现接口中的方法,这里不需要像多态中用到的 override 改写方法,直接拿过来加上方法体就可!
        /// </summary>
      public void SayHello()
        {
            Console.WriteLine("大家好!"+this.name);
        }

    }

}

运行结果:

总结:接口的本质就是一些方法!但是要使用这些方法必须要按照一定的规则,否则就不能使用。定义接口,其实质就是定义规则,要使用接口,必须在它的规则下进行!


三、抽象
抽象类和接口有一些相似之处,它们都包含由派生类继承的成员,接口和抽象类都不能直接实例化!(虚的东西你怎么能拿来使用呢对吧?必须要使用第三方的东西来搭桥)
using System;//包含基本类和基类
using System.Collections.Generic;//定义泛型集合的接口和类
using System.Linq;//支持语言集成查询
using System.Text;//包含用于字符编码等功能的对象

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            UseMyAbstract u = new UseMyAbstract();//创建对象,调用方法
            u.SayHello();
            Console.ReadKey();
        }
    }
    /// <summary>
    /// 定义一个抽象类MyAbstract
    /// </summary>
    abstract class MyAbstract
    {
       public abstract void SayHello();//定义一个抽象方法,同样没有方法体!
    }
    /// <summary>
    ///定义一个 UseMyAbstract类 继承 MyAbstract抽象类
    /// </summary>
    class UseMyAbstract : MyAbstract
    {
        public override void SayHello()//改写抽象类MyAbstract中的方法SayHello()
        {
            Console.WriteLine("大家好!我是龙腾!");
        }
    }

}

运行结果:

总结:抽象类可以拥有抽象成员,但是不能直接被实例化,并且没有代码体,它的执行方法是在其派生类中实现的!注意,只要这个类中有一个方法定义为抽象方法,那么这个类必须定义为抽象类!

以上只是我个人的一些小的学习感悟,不喜勿碰额!!!!希望能帮到那些需要帮到的人!

本人QQ:946478845 在黑马群 希望和大家一起交流学习!

---------------------- <a href="http://net.itheima.com/" target="blank">Windows Phone 7手机开发</a>、<a href="http://net.itheima.com/" target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://net.itheima.com/" target="blank">http://net.itheima.com/</a>

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

2 个回复

倒序浏览
谢谢分享哦!!!!!!!!!!!
回复 使用道具 举报
顶起,楼主写的很详细
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马