1)定义Student类,用string型变量name存储学生姓名,用int型变量age存储学生年龄。Student类实现IComparable接口。要求从键盘输入学生的姓名和年龄,并注意可能出现的异常及其处理。IComparable接口定义如下(系统已定义,可直接使用)

interface IComparable

{

int CompareTo(object obj);

//如果自身与obj相等返回0,<obj返回-1,>obj返回1 ,注意可能出现的异常

}

(2)定义Student类的派生类Master。

(3)定义Sort类,定义静态方法BubbleSortDescending(IComparable[] bubbles),实现对象的降序排列。其中,在该方法中调用接口方法CompareTo(object obj)比较两个对象的“大小”。

(4)定义Test类,按给定数据生成Student实例数组,调用BubbleSortDescending(IComparable[] bubbles)使之按姓名排序,按给定数据生成Master实例数组,调用BubbleSortDescending(IComparable[] bubbles)使之按年龄排序,请遍历输出排序前后数组中每个元素实例中的name和age。如果Master实例a与Student实例b比较,总是a>b

(5)实验数据

Name

Age

Tom

Nick

Mike

(a)当这三个学生全为Student的实例时,输出排序后的结果;

(b)当这三个学生全为Master类的实例时,输出排序后的结果

(c)(选作)任意指定数组中元素的类型(Student或Master),输出排序后的结果

(6)分析并解释实验结果。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Q4
{
interface IComparable
{
int CompareTo(object obj);
} class Student : IComparable
{
string name;
int age;
public Student(string name, int age)
{
this.name = name;
this.age = age; } public virtual int CompareTo(object obj)//对接口的方法进行重写
{
Student other = (Student)obj;
if (other != null)
{
if (string.Compare(name,other.Name)<0) return 1;
else if (string.Compare(name, other.name) == 0) return 0;
else return -1;
}
else
throw new ArgumentException("Object is not a Student");
}
public string Name
{
get
{
return name;
}
} public int Age
{
get
{
return age;
}
}
} class Master : Student
{
string name;
int age;
public Master(string name, int age) : base(name, age)
{
this.name = name;
this.age = age;
}
public override int CompareTo(object obj)//override 对student里的compareto方法进行重写
{
Master other = (Master)obj;//强制类型转换
if (other!= null)//判断是否空,异常
{
if (age < other.Age) return 1;
else if (age == other.Age) return 0;
else return -1;
}
else
throw new ArgumentException("Object is not a Master");
} public new string Name
{
get
{
return name;
}
} public new int Age
{
get
{
return age;
}
}
} class Sort
{
static IComparable g;//在静态函数里面的变量也要用静态
public static void BubbleSortDescending(IComparable[] bubbles)
//因为这里student类继承icomparable,而master继承student,所以这里要用ICmparable
{
for (int i = 0; i < bubbles.Length - 1; i++)
{
if (bubbles[i].CompareTo(bubbles[i + 1]) > 0)
{
g = bubbles[i];
bubbles[i] = bubbles[i + 1];
bubbles[i + 1] = g; }
}
}
} class Test
{
static void Main(string[] args)
{
IComparable[] a = new Student[3];//用了多态,因为Student继承IComparable,所以可以这样写
a[0] = new Student("Tom", 18);//c初始化,也是要用new
a[1] = new Student("Nike", 20);
a[2] = new Student("Mike", 17);
Sort.BubbleSortDescending(a);
foreach(Student b in a )//a是数组名所以直接 in a
{
Console.WriteLine("{0}----{1}", b.Name, b.Age);
} Master[] c = new Master[3];
c[0] = new Master("Tom", 18);
c[1] = new Master("Nike ", 20);
c[2] = new Master("Mike", 17);
Sort.BubbleSortDescending(c);
Console.WriteLine();
foreach(Master d in c)
{
Console.WriteLine("{0}----{1}", d.Name, d.Age);
} }
}
}

c#接口与虚函数的实验报告的更多相关文章

  1. C#虚函数和接口的区别

    接口只能声明不能实现,虚函数可以. 接口:对外提供可以访问的函数叫接口.虚函数不需要被强制重写,其本身含有实现部分. 抽象类:指派了派生类必须实现的函数(纯虚函数),不然编译不通过. 虚函数的限制:  ...

  2. 关于C++与Java中虚函数问题的读书笔记

    之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的 ...

  3. C++回顾day03---<纯虚函数和抽象类以及虚析构函数,delete使用>

    一:纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本 纯虚函数为各个派生类提供一个公共接口 纯虚函数的形式: virtual 类型 函数名(参数列 ...

  4. c++ 多态,虚函数、重载函数、模版函数

    c++三大特性:封装.继承.多态.封装使代码模块化,继承扩展已存在的代码,多态的目的是为了接口重用 虚函数实现:虚函数表:指针放到虚函数表 多态:同名函数对应到不同的实现 构造父类指针指向子类的对象 ...

  5. why pure virtual function has definition 为什么可以在基类中实现纯虚函数

    看了会音频,无意搜到一个frameworks/base/include/utils/Flattenable.h : virtual ~Flattenable() = 0; 所以查了下“纯虚函数定义实现 ...

  6. 第八周课程总结 & 实验报告(六)

    第八周课程总结 一.包装类 介绍 装箱与拆箱 应用 二.异常 基本概念 基本格式 异常类的继承结构 throws关键字 throw关键字 Exception类和RuntimeException类 自定 ...

  7. c# 基础(重写与覆盖:接口与抽象,虚函数与抽象函数)

    总结 1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改). 2:当用子类创建父类的时候,如 C1 c3 = new C2(),重写会改变父类的功能,即调用子类的功能:而覆盖 ...

  8. C# 类的多态、结构、接口、抽象、虚函数总结

    多态: 类的多态是通过在子类(派生类)中重载基类的虚方法或成员函数来实现的. 可见,重载和虚函数的重写,并在调用时用父类装箱子类对象,是实现多态的一种重要的编程方式. 接口: 接口是一种用来定义程序的 ...

  9. JAVA – 虚函数、抽象函数、抽象类、接口

     本文转载地址:http://blog.csdn.net/trojanpizza/article/details/6556604 1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加 ...

随机推荐

  1. shell 多重条件判断

    多重条件判断 '判断1 -a 判断2' 逻辑与,判断1和判断2都成立,最终的结果才为真 '判断1 -o 判断2' 逻辑或,判断1和判断2有一个成立,最终的结果就为真 '!判断' 逻辑非,使原始的判断式 ...

  2. day04_python_1124

    01 上周内容回顾 int bool str int < --- > str: i1 = 100    str(i1) s1 = '10'    int(s1)字符串必须是数字组成. in ...

  3. ldap+flask+python2实现统一认证里面的那些编码神坑

    首先想吐槽下,直接接手别人的项目,而且是经过四五个人手的项目,是怎么个痛苦.两三套代码django.flask.tornado应有尽有,代码里,掰开手指头就可数的全英文注释,几台服务器没交接清楚,所有 ...

  4. 利用FFMPEG命令进行文件分割

    ffmpeg -ss 00:00:00 -i input.mp4 -c copy -t 60 output.mp4 -ss 表示视频分割的起始时间,-t 表示分割时长,同时也可以用 00:01:00表 ...

  5. MySQL5.6数据库8小时内无请求自动断开连接

    问题: 最近的项目中,发现Mysql数据库在8个小时内,没有请求时,会自动断开连接,这是MySQL服务器的问题.The last packet successfully received from t ...

  6. c语言中printf("%x",-1);为什么会输出-1的十六进制补码??

    计算机存储的时候是以补码的形式存进去的,输出来在以你原码的形式输出(这个形式就是你设置的形式)! 比如: -1 (32位模式) 存: 1 000000000000000000000000000000 ...

  7. thymeleaf之下拉框回显选中

    #1.select下拉框取值    <div class="form-group ">        <label id="resource" ...

  8. html回顾随笔JS(*^__^*)

    ---恢复内容开始--- map遍历 function b(){ var week = new Map(); week.set("Mon","星期一"); we ...

  9. 90%会搞错的JavaScript闭包问题

    由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) ...

  10. Linux文件系统命令 split

    命令:split 功能:将文件按照一定的规则进行切割 用法:-l 表示按照行数进行切割. -b 表示按照字节进行切割,切割后的文件名为自己定义的文件名+aa,ab,ac类似的后缀. eg: 按照行数进 ...