第八章 泛型类

1 概述

1.1 引入泛型的原因

先从一个例子来说明这个问题

    class AssembleSample
    {
        static void Main()
        {
            ContactTable cont = new ContactTable(10);
            cont[0] = new Business("李明");
            Assemble a = cont;
            a[1] = new ClassMate("张鹏");
            IOutput i = cont;
            i.Output();
        }
    }

    /// <summary>
    /// 接口IAccessable
    /// </summary>
    public interface IAccessable
    {
        int Length
        {
            get;
        }

        object this[int index]
        {
            get;
            set;
        }

        object GetAt(int index);
        void SetAt(int index, object obj);
    }

    /// <summary>
    /// 抽象类:集合Assemble
    /// </summary>
    public abstract class Assemble:IAccessable
    {
        //字段
        protected object[] m_list;

        //属性
        public int Length
        {
            get
            {
                return m_list.Length;
            }
        }

        //索引函数
        public object this[int index]
        {
            get
            {
                return m_list[index];
            }
            set
            {
                m_list[index] = value;
            }
        }

        //构造函数
        public Assemble(int iLength)
        {
            m_list = new object[iLength];
        }

        //方法
        public object GetAt(int index)
        {
            return m_list[index];
        }

        public void SetAt(int index, object obj)
        {
            m_list[index] = obj;
        }
    }

    /// <summary>
    /// 派生类:联系人集合
    /// </summary>
    public class ContactTable:Assemble,IOutput
    {
        //覆盖索引函数
        public new Contact this[int index]
        {
            get
            {
                return (Contact)m_list[index];
            }
            set
            {
                m_list[index] = value;
            }
        }

        //构造函数
        public ContactTable(int iLength)
            : base(iLength)
        {
        }

        //方法
        public new Contact GetAt(int index)
        {
            return (Contact)m_list[index];
        }

        public void SetAt(int index, Contact c)
        {
            m_list[index] = c;
        }

        void IOutput.Output()
        {
            foreach (Contact c in m_list)
            {
                if (c != null)
                    c.Output();
            }
        }

    }

程序输出结果:

商务:李明先生/女士
办公电话:未知
手机:未知
商务传真:未知

同学:张鹏
住宅电话:未知
办公电话:未知
手机:未知
生日:0001-1-1 0:00:00

请按任意键继续. . .

上例中的派生类ContactTable是从基类Assemble中继承,但是在它的索引函数以及GetAt方法的定义中,方法成员的返回类型与基类不一致,因此不能算是重载(override)方法,而是覆盖(new)方法。对于基类和派生类的的SetAt方法,由于方法参数不同,它们根本就是两个不同的方法。

时间: 2024-10-15 20:47:26

第八章 泛型类的相关文章

《Linux内核设计与实现》读书笔记 第十八章 调试

第十八章调试 18.1 准备开始          需要准备的东西: l  一个bug:大部分bug通常都不是行为可靠而且定义明确的 l  一个藏匿bug的内核版本:找出bug首先出现的版本 l  相关内核代码的知识和运气 最好能让bug重现,有一些bug存在而且有人没办法让他重现,因为内核与用户程序和硬件间的交互很微妙. 18.2内核中的bug 可以有无数种原因产生,表象也变化多端.代码中的错误往往引发一系列连锁反应,目击者才看到bug. 18.3通过打印来调试 内核提供了打印函数printk

Java泛型类泛型方法

使用泛型,在某些情况下可以有效减少代码量. Pair泛型类可以根据传入的参数类型进行相应的构造. minmax是泛型方法,不同数据类型的数组,也可以得到他们的min max值,需要注意的是传进去的T[]类类型必须是实现了Comparable方法的,否则无法调用compareTo()方法. 另外,泛型的类型必须是类类型,int, double, float这种是不行的,必须是Integer, Double, Float, String, StudentClass这种类类型的. /** 泛型类 *

第八章、Linux 磁盘与文件系统管理

第八章.Linux 磁盘与文件系统管理 1. 认识 EXT2 文件系统 1.1 硬盘组成与分割的复习 1.2 文件系统特性: 索引式文件系统 1.3 Linux 的 EXT2 文件系统(inode): data block, inode table, superblock, dumpe2fs 1.4 与目录树的关系 1.5 EXT2/EXT3 文件的存取与日志式文件系统的功能 1.6 Linux 文件系统的运行 1.7 挂载点的意义 (mount point) 1.8 其他 Linux 支持的文

Java 第八章 类的方法(一) 笔记

Java 第八章 类的方法(一) 一.类的方法语法: 访问修饰符 返回值类型 方法名(){             方法体:      } 二.方法名的规范:     1.必须以字母."_"或"$"开头     2.可以有数字,但不能以数字开头.     3.如果方法名是多个单词组成 ,第一个单词的首字母小写,      其后单词首字母单词大写.     4.方法名都采用动词. 三.方法的返回值     1.有返回值:必须告知返回值的数据类型,并且返回相应的值. 

ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation

ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 本章三个非常重要概念:TF,SLAM,AMCL.务必掌握. 补充内容:http://blog.csdn.net/zhangrelay/article/details/50299417 第216页: 简介本章要点. 第217页: 导航综合功能包组成架构等. 补充如下: 目录 配置并使用导航功能

19._7泛型继承之泛型类继承普通类

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _19._7泛型继承之泛型类继承普通类 { abstract class genClass<T> { protected T field; public virtual T property { get { return field; } } p

五到八章心得

第五章 本章主要学习关于开发板的测试环境,由于我们所开发的Linux驱动,不管使用何种方法编译后,都需要在开发板上进行测试,这是因为在ARM架构的开发板可以在X86架构的PC在CPU指令及二进制格式上有所不同 ,而且在Linux所需要的硬件在PC上很难进行模拟,因此要在开发板上进行调试和测试. 本章主要介绍了S3C6410开发板,这是一款低功耗.高性价比的RISC,可广泛应用于移动电话和通用处理等领域. 安装串口调试工具minicom的步骤:1.检测当前系统是否支持usb转串口:2.安装mini

Java泛型学习笔记 - (二)泛型类

1. 我们先写一个没有泛型的类Box: 1 public class Box { 2 3 private Object obj; 4 5 public Box() {} 6 7 public Object getObj() { 8 return obj; 9 } 10 11 public void setObj(Object obj) { 12 this.obj = obj; 13 } 14 15 public Box(Object obj) { 16 super(); 17 this.obj

Android群英传笔记——第八章:Activity与Activity调用栈分析

Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命周期和管理方式,是了解Android的基础,本节主讲 Activity的生命周期与工作模式 Activity调用栈管理 一.Activity Activity作为四大组建出现平率最高的组件,我们在哪里都能看到他,就让我们一起先来了解一下他的生命周期 1.起源 Activity是用户交互的第一接口,他