Home  >  Article  >  Database  >  面向对象基础(2)

面向对象基础(2)

WBOY
WBOYOriginal
2016-06-07 15:42:571082browse

一.抽象类和接口: 1.抽象类: 我们观察发现,Animal类其实根本就不可能实例化,动物是一个抽象名词,没有具体对象与之对应,可以把实例化没有意义的类改成抽象类,同样getShoutSound函数也没有 任 何意义,可以将virtual修饰符修改为abstract,使之成为抽象方

一.抽象类和接口:

     1.抽象类:

                我们观察发现,Animal类其实根本就不可能实例化,动物是一个抽象名词,没有具体对象与之对应,可以把实例化没有意义的类改成抽象类,同样getShoutSound函数也没有                   任 何意义,可以将virtual修饰符修改为abstract,使之成为抽象方法     

    abstract class Animal
    {
        ……
        protected abstract string getShoutSound();
    }
            *注意:

                     第一,抽象类不能实例化
                                      比如动物实例没有实际意义
                     第二,抽象方法必须是被子类重写的方法
                                      不重写的话,也没有存在意义,看作没有实现体的虚方法
                     第三,如果类中包含抽象方法,那么类必须定义为抽象类,无论是否包含一些其它方法

       好了,我们想一下,竟然抽象类的抽象方法需要子类实现,那么出现下面的这种情况的话就会出现问题了........

      面向对象基础(2)

这样的话要是在父类Animal定义抽象方法的话,猴,猪等都要去实现它,但是他们并没有这种方法,因此引入接口。。

     2.接口.

              接口(interface)是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦类实现了接口,类就可以支持接口所指定的所有属性和成员。声明接口在语法上与               声明抽象类完全相同,但不允许提供接口中任何成员的执行方式。
              一个类可以支持多个接口,多个类也可以支持同一个接口。       

    interface IChange
    {
        string ChangeThing(string thing);//不能有方法体和修辞符
    }
  例如:哆啦A梦类的实现:         
    class MachineCat:Cat, IChange//实现类和接口
    {
        public MachineCat() : base()
        {
        }

        public MachineCat(string name): base(name)
        {
        }

        public string ChangeThing(string thing)
        {
            return base.Shout() + " 我有万能的口袋,我可变出" + thing;
        }
    }

3.抽象类和接口的区别:

抽象类可以给出一些成员的实现,接口却不包含成员的实现,抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现,一个类只能继承一个抽象类,但可实现多个接口等。
第一,类是对象的抽象,抽象类是对类的抽象;接口是对行为的抽象。
第二,如果行为跨越不同类的对象,可使用接口;对一些相似的类对象,用继承抽象类。

第三,从设计的角度讲,抽象类是从子类中发现了公共的东西,泛化出了父类,然后子类继承父类,而接口是根本不知子类的存在,方法如何实现还不确认,是预先定义的


二.集合和泛型

1.集合:

 来用例子说明:

     面向对象基础(2)

ArrayList实现了IList接口,所以可以用ArrayList的实例来赋值给IList(类似于多态),使用Arraylist里面的方法

面向对象基础(2)

            IList AnimalList = new ArrayList();
            AnimalList.Add(new Cat("小花"));
            AnimalList.Add(new Dog("阿毛"));
            AnimalList.Add(new Cat("小黑"));
            AnimalList.Add(new Dog("娇娇"));
            AnimalList.Add(new Dog("咪咪"));
            AnimalList.Insert(1,new Cat("哆啦A梦"));

            foreach (Animal item in AnimalList)//这里的AnimalList里面的每一项都是Animal的子类,所以可以采用多态的形式来使用
            {
                MessageBox.Show(item.Shout());
            }        


2.泛型:

泛型是具有占位符(类型参数)的类、结构、接口和方法,在IList和List后面加,这个T就是集合数据的数据类型。

        private void button6_Click(object sender, EventArgs e)
        {
            IList AnimalList = new List();
            AnimalList.Add(new Cat("小花"));
            AnimalList.Add(new Dog("阿毛"));
            AnimalList.Add("Hello World");

            foreach (Animal item in AnimalList)
            {
                MessageBox.Show(item.Shout());
            }            
        }
这样写的话程序会报错,因为"Helllo world"不是一个Animal的派生对象,需要这样改进。。。
IList AnimalList = new List();
            AnimalList.Add(new Cat("小花"));
            AnimalList.Add(new Dog("阿毛"));
            AnimalList.Add("Hello World");

            foreach (Animal item in AnimalList)
            {
                MessageBox.Show(item.Shout());
            }            

这样以来,"Helllo world"就是一个Animal的派生对象,可以对这个集合进行操作了。。。。。。

OK,整了两个多小时,终于整理完了,期待下节课!!!!


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn