泛型+多态

问:泛型 T我们常说是类的占位符,但是这个"T"是通过什么机制,来正常运行得到正确的结果呢?

答:泛型是在多态上开花结果的。

举一个简单的例子:男女平均身高是不同的,所以判断男,女身高的标准就不同,但是两者的比较过程是完全一样的。如果我们只写一个比较身高的方法,如果按照男士的平均身高进行判断,那么对女士来说就是不准确的,如果按照女士的平均身高来判断,那么对男士来说是不准确的,那么如何做到判断男士身高根据男士平均身高,判断女士根据女士平均身高呢?对象为男士的话,调用男士对象的身高方法,对象为女士的话,调用女士的身高方法。

现在创建一个父类:

namespaceGeneric.demo
{
    public class Person
    {
        public double height;
        public string name;
        public Person()
        {
            this.height = 1.6;
            this.name = "小菜";
        }

        public Person(string name,doubleheight)
        {
            this.height = height;
            this.name = name;
        }
        virtual public void IsTall()
        {
            if (height > 1.68)
            {
                Console.Write("The Personnamed {0} is tall", name);
                Console.WriteLine();
            }
            else
            {
                Console.Write("The Personnamed {0} is short", name);
                Console.WriteLine();
            }
        }

    }
}

现在创建一个子类

namespaceGeneric.demo
{
    public class Woman : Person
    {
        public Woman()
        {
            this.height = 1.68;
            this.name = "小红";
        }
        public Woman(string name, doubleheight)
        {
            this.height = height;
            this.name = name;
        }

        public override void IsTall()
        {
            if (height > 1.68)
            {
                Console.Write("The Womannamed {0} is tall", name);
                Console.WriteLine();
            }
            else
            {
                Console.Write("The Womannamed {0} is short", name);
                Console.WriteLine();
            }
        }
    }
}

现在创建一个子类:

namespaceGeneric.demo
{
    public class Man : Person
    {
        public Man()
        {
            this.height = 1.78;
            this.name = "张亮";
        }
        public Man(string name, double height)
        {
            this.height = height;
            this.name = name;
        }
        public override void IsTall()
        {
            if (height > 1.78)
            {
                Console.Write("The Mannamed {0} is tall", name);
                Console.WriteLine();
            }
            else
            {
                Console.Write("The Womannamed {0} is short", name);
                Console.WriteLine();
            }
        }
    }
}

现在创建一个泛型类:

namespaceGeneric.demo
{
    public class HeightCompare<T> where T: Person
    {
        public void IsTall(T person)
        {
            person.IsTall();
        }
    }
}

现在对泛型类进行调用

static void Main(string[] args)
        {

            //人对象
            Person person=newPerson("张",1.79);

            HeightCompare<Person> hc =new HeightCompare<Person>();

            hc.IsTall(person);

            //男人对象
            Man man = newMan("李",1.80);

            HeightCompare<Man> hcm = newHeightCompare<Man>();

            hcm.IsTall(man);

            //女人对象
            Woman woman = newWoman("杨", 1.69);
            HeightCompare<Woman> hcw =new HeightCompare<Woman>();
            hcw.IsTall(woman);
        }

运行结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-23 09:57:54

泛型+多态的相关文章

JAVA泛型多态

先度娘一下多态的概念: 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误: 如果有,再去调用子类的该同名方法. (来源:http://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html) 那如果要在Java中泛型做多态如何使用

文章归档

01 Java 基础语法 Java基础语法<一> 数据类型&运算符 Java基础语法<二> 字符串String 编辑 Java基础语法<三> 输入输出 编辑 Java基础语法<四> 控制流程  编辑 Java基础语法<五> 大数值BigInteger BigDecimal  编辑 Java基础语法<六> 数组 Arrays 编辑 Java基础语法<七> 对象与类 封装          编辑 Java基础语法<

关于 Java 你不知道的 10 件事

作为 Java 书呆子,比起实用技能,我们会对介绍 Java 和 JVM 的概念细节更感兴趣.因此我想推荐 Lukas Eder 在 jooq.org 发表的原创作品给大家. 你是从很早开始就一直使用 Java 吗?那你还记得它的过去吗?那时,Java 还叫 Oak,OO 还是一个热门话题,C++ 的 folk 者认为 Java 是不可能火起来,Java 开发的小应用程序 Applets 还受到关注. 我敢打赌,下面我要介绍的这些事,有一半你都不知道.下面让我们来深入探索 Java 的神秘之处.

关于Java你可能不知道的10件事

关于Java你可能不知道的10件事 分享到: 24 本文由 ImportNew - Jerry Lee 翻译自 Jooq.欢迎加入翻译小组.转载请参见文章末尾的要求. 呃,你是不是写Java已经有些年头了?还依稀记得这些吧: 那些年,它还叫做Oak:那些年,OO还是个热门话题:那些年,C++同学们觉得Java是没有出路的:那些年,Applet还风头正劲-- 但我打赌下面的这些事中至少有一半你还不知道.这周我们来聊聊这些会让你有些惊讶的Java内部的那些事儿吧. 1. 其实没有受检异常(check

Java学习:迭代器简介

迭代器 java.util.Iterator接口:迭代器(对集合进行遍历) 有两个常用的方法 boolean hasNext() 如果仍有元素可以迭代,则返回 true. 判断集合中还有没有下一个元素,有就返回true,没有就返回false. E next() 返回迭代的下一个元素 取出集合中的下一个元素 Iterator迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊 Collection接口中有一个方法,叫iterator(),这个方法

集合单列--Colletion

集合 学习集合的目标: 会使用集合存储数据 会遍历集合,把数据取出来 掌握每种集合的特性 集合和数组的区别 数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型的元素,可以存储基本数据类型值.集合存储的都是对象.而且对象的类型可以不一致,在开发中一般当对象多的时候使用集合进行存储. 集合框架 JAVASE提供了满足各种需求的API,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用. 集合按照其存储结构可以分为两,分别是单

2016年11月27日--面向对象:多态、类库、委托、is和as运算符、泛型集合

1.虚方法 virtual 重写 override 父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了virtual关键字的方法才可以被子类重写,子类重写父类的方法使用的是override关键字 例: 我们都知道,喜鹊(Magpie).老鹰(Eagle).企鹅(Penguin)都是属于鸟类,我们可以根据这三者的共有特性提取出鸟类(Bird)做为父类,喜鹊喜欢吃虫子,老鹰喜欢吃肉,企鹅喜欢吃鱼. 创建基类Bird如下,添加一个虚方法Eat(): /// <sum

多态、类库、委托、is和as运算符、泛型集合

多态:简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual 重写 override 父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了virtual关键字的方法才可以被子类重写 子类重写父类的方法使用的是override关键字 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多态 { pub

多态,虚拟方法,重写,接口,类库,委托,is,as运算符,泛型集合,万能变量

多态:简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual重写 override 父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了virtual关键字的方法才可以被子类重写 子类重写父类的方法使用的是override关键字 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多态 { publ