c#接口与虚函数的实验报告

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


18


Nick


20


Mike


17

(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);
            }

        }
    }
}

原文地址:https://www.cnblogs.com/ilovetheworld/p/10134504.html

时间: 2024-10-18 17:03:23

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

微机接口技术与汇编语言上机实验报告_汇编初步(intel8086)

实验环境:intel x386 一.要求:将3000H单元开始置数为00H-0FH SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE, SS:SSTACK START: PUSH DS XOR AX, AX MOV DS, AX MOV SI, 3000H MOV CX, 16 AA1: MOV [SI], AL INC SI INC AL LOOP AA1 ;CX == 0? NEXT():AA1

C#虚函数和接口的区别

接口只能声明不能实现,虚函数可以. 接口:对外提供可以访问的函数叫接口.虚函数不需要被强制重写,其本身含有实现部分. 抽象类:指派了派生类必须实现的函数(纯虚函数),不然编译不通过. 虚函数的限制:    1.虚函数仅适用于有继承关系的类对象,   所以只有类的成员函数才能说明为虚函数.      2.静态成员函数不能是虚函数.      3.内联函数不能是虚函数.      4构造函数不能是虚函数.      5.析构函数可以是虚函数. 接口可以有静态成员.嵌套类型.抽象.虚拟成员.属性和事件

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

之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的代码,输入结果竟是Base,这让一直以来用C/C++的我有些莫不着头脑,不是Java里对象是引用吗?C/C++中通过指向基类的指针或引用来指向派生类,那么对于虚函数来说通过基类指针使用的是指向的派生类.但在Java中没有keyword标明虚函数,此时就不是非常明确究竟调用的谁. class base

C++ 虚函数实现多态浅析

这几天深入学习了一下c++多态,趁此总结了一下多态中的虚函数,先看一下c++多态中的定义 多态定义: 父类指针指向子类对象,通过父类指针或引用可以调用到正月版本的函数. 而本文主要尝试解释:为什么父类指针指向子类对象,通过父类指针或引用可以调用到正月版本的函数? 如有大牛有更好解释,还望共同探讨.废话不说,直接进入正题 先定义四个类 如下: // //  main.cpp //  project13 // //  Created by 就不告诉你我是谁 on 15-8-7. //  Copyri

&lt;C++&gt; 类(3):初始化列表 常函数和常量对象 虚函数与多态(包括纯虚函数)

一.初始化列表(初始化列表中必须有的两个内容) 1.类中const的成员变量: ①特点:不能修改 必须初始化 在构造函数后面加冒号 格式为:":变量名(值)" 也就是说 常量必须在初始化列表中初始化 ②执行顺序:构造函数先执行初始化列表 然后执行函数中的内容 1 #include<iostream> 2 using namespace std; 3 4 class CPerson 5 { 6 public: 7 const int a; 8 public: 9 CPerso

第八周课程总结 &amp; 实验报告(六)

第八周课程总结 一.包装类 介绍 装箱与拆箱 应用 二.异常 基本概念 基本格式 异常类的继承结构 throws关键字 throw关键字 Exception类和RuntimeException类 自定义异常类 三.多线程 基本概念 进程 多线程 Java中线程的实现 继承Thread类 实现Runnable接口 Thread和Runnable的区别 一.包装类        1.介绍                                8种基本类型变包装类 (1)除了Character

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

1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加上virtual关键字就成为虚函数 Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑定是Java的默认行为.如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数 PS: 其实C++和Java在虚函数的观点大同小异,异曲同工罢了. 2. Java抽象函数(纯虚函数) 抽象函数或者说是纯虚函数的存在是为了定义接口. C++中纯虚函数形式为:virtual void print(

C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较

由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针类型来判断的).纯虚函数是一种在父函数中只定义而不实现的一种函数,不能用来声明对象,也可以被称为抽象类.纯虚函数的实现也可以在类声明外进行定义.C++中的抽象类abstract class是指至少有一个纯虚函数的类,如果一个类全部由纯虚函数组成,不包括任何的实现,被称为纯虚类. Java中的普通函数

虚函数、纯虚函数和接口的实用方法和意义

从理论上来说,这三个概念很容易背的滚瓜烂熟,但是从大学毕业到现在,我都没真正搞明白这三个东西的出现,究竟是为了做到什么事情. 也许之前我很少写代码,更很少写面向对象的代码,即使有写多半也很容易写回到面向过程的老路上去.在写面向过程的代码的时候,根本不管什么函数重载和覆盖,想到要什么功能就变得法子的换个函数名字,心里想想:反正函数重载本质也就是入栈了两个不同的函数. 知道后来我才慢慢了解,这些概念的出现,完全就不是为了编程的功能实现,而是编程的易用和扩展,准确的来说是方便再次开发而提出的一种标准而