加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C#实训项目六:类的设计与应用

(2010-11-16 23:35:40)
标签:

法中

派生类

构造函数

基类

方法

it

分类: IT技术

一 实习目的

1.掌握类和对象。

2.掌握类的构造函数的定义及应用。

3.理解C#中访问修饰符的应用。

4.掌握属性及索引器的定义及应用。

5.掌握接口及抽象类的定义及应用。

6.掌握继承与多态机制

二 实习内容与过程

设计题目一:定义动物类Animal,在类中定义字段、属性和虚拟方法;由基类Animal创建派生类Dog、Cat,在派生类中实现方法重载;在程序中实例化类的对象并且调用类的方法。

提示:

1)定义基类Animal:为项目添加公有类Animal,保存在文件Animal.cs中。

2)为基类Animal添加下列字段、属性和方法:

   a)私有字段sex,代表性别,数据类型为bool;

   b)私有字段age,代表年龄,数据类型为int;

   c)公有属性Sex,用于获取和设置sex字段,包含get访问器和set访问器,在类的构造函数中设置初始值为false;

   d)公有属性Age,用于获取和设置age字段,包含get访问器和set访问器;

   e)虚拟方法Introduce(),用于介绍动物:

      I)若属性Sex的值为true,方法返回一个字符串"This is a male Animal!";

      II)若属性Sex的值为false,则方法返回一个字符串"This is a female Animal!"。

3)定义派生类Dog和Cat,在其中重写基类的构造函数和虚拟方法:

   a)从基类Animal中派生出公有类Dog和Cat,仍然保存在文件Animal.cs中;

   b)在类Dog的构造函数中,设置属性Sex的初始值为true;

   c)在类Dog中重写基类Animal的虚拟方法Introduce:

      I)若属性Sex的值为true,方法返回一个字符串"This is a male Dog!";

      II)若属性Sex的值为false,则方法返回一个字符串"This is a female Dog!"。

   d)在类Cat中重写基类Animal的虚拟方法Introduce:

      I)若属性Sex的值为true,方法返回一个字符串"This is a male Cat!";

      II)若属性Sex的值为false,则方法返回一个字符串"This is a female Cat!"。

4)在程序主方法中实例化类的对象,调用方法输出介绍动物的字符串:

   a)实例化Animal的一个对象ani,调用类的方法Introduce(),并输出方法返回的字符串;

   b)实例化Dog的一个对象dog,调用类的方法Introduce(),并输出方法返回的字符串;

   c)实例化Cat的一个对象cat,调用类的方法Introduce(),并输出方法返回的字符串;

  5)程序设计完成之后进行编译,生成项目的EXE可执行文件并运行。

 

Animal类的参考设计:

其中派生类之一的框架:

 

程序运行的参考图:

 

 

  //基类

    class Animal

    {

        //两个保护字段

        protected  bool sex;

        protected  int age;

 

        //构造函数

        public   Animal()

        {

            sex = true ;

            age = 0;

        }

 

        //构造函数

        public Animal(bool s, int a)

        {

            s = sex;

            a = age;        

       }

 

        //公有属性

        public bool  Sex

        {

            get

            {

                return sex;

            }

            set

            {

                sex = value;

            }

        }

        //公有属性

        public int  Age

        {

            get

            {

                return age;

            }

            set

            {

                age = value;

            }

        }

 

        //虚拟方法

        public virtual string Introduce()

        {

            if (sex )

            {

                return "this is a male Animal";

            }

            else

            {

                return "this is a female Animal";

            }

        }

    }

 

    //派生类

    class Dog : Animal

    {

        //构造函数

        public Dog()

        {

            sex = true;

        }

 

        //调用虚拟方法

        public  override  string Introduce()

        {

            if (sex )

            {

                return "this is a  male dog";

            }

            else

            {

                return "this is a female dog";

            }

        }

    }

 

 

    class Cat : Animal

    {

        //构造函数

        public Cat()

        {

            sex = true;

        }

        //调用虚拟方法

        public override  string Introduce()

        {

            if (sex )

            {

                return "this is a  male cat";

            }

            else

            {

                return "this is a female cat";

            }

        }

 

  static void Main(string[] args)

        {

            //实例化类的对象

            Animal ani = new Animal();

            Console.WriteLine(ani.Introduce ());

            Dog dog = new Dog();

            Console.WriteLine(dog.Introduce());

            Cat cat = new Cat();

            Console.WriteLine(cat.Introduce());

 

        }

1.    设计题目二:编写控制台应用程序,实现类的多态性机制。现有形状类,其中有一个求形状面积的虚方法。有圆形、正方形和三角三个类派生于形状类。在这三个类中分别设置相关字段,及属性用于求解面积。分别重写基类形状类的面积方法,求解出派生类自己的面积并输出。

在测试类中,分别通过创建派生类的实例调用各自面积方法。

在测试类中,定义一个调用派生类的求其面积的方法,参数为基类的句柄,分别通过将基类的句柄指向派生类的实例来调用面积求解方法。

提示:

    分别编写形状类、圆形类、正方形类和三角形类的代码。

 

参考如下:形状类

圆形类

三角形类:

    class Circle : Shape

    {

        private double r;

        private double s;

        private const double PI = 3.14;

 

        //构造函数

        public Circle()

        {

            r = 5;

        }

        public Circle(double r)

        {

            this.r = r;

        }

        //定义属性

        public double R

        {

            get { return r; }

            set { r = value; }

        }

        //定义虚拟方法

        public override void  Area()

        {

            s = PI * r * r;

            Console.WriteLine( "圆的面积是:"+s) ;

        }

    }

 

    class Shape

    {

        public virtual void Area()

        {

            Console.WriteLine("基类面积方法!");

        }

 

      

    }

 

  class Square:Shape

    {

        private double length;

        private double s;

        public Square()

        {

            length = 10;

           

        }

        public Square(double length)

        {

            this.length = length;

           

        }

 

        public double Length

        {

            get { return length; }

            set { length = value; }

        }

      

        public override void Area()

        {

            s = length * length;

            Console.WriteLine( "正方形的面积是:"+s);

        }

}

class TestShape

    {

        static void Main(string[] args)

        {

            Console.WriteLine("请输入圆的半径:");

            double r = double.Parse(Console.ReadLine());

            Circle c = new Circle(r);

            c.Area();

            Console.ReadLine();

 

            Console.WriteLine("请输入正方形的边长:");

            int edge = int.Parse(Console.ReadLine());

            Square s = new Square(edge);

            s.Area();

            Console.ReadLine();

 

            Console.WriteLine("请输入三角形的底和高:");

            double l = double.Parse(Console.ReadLine());

            double h = double.Parse(Console.ReadLine());

            Tringle t = new Tringle(l,h);

            t.Area();

            Console.ReadLine();

 

            //下面测试通过将基类句柄指向派生类的实例来实现方法的调用

            Console.WriteLine("测试用圆的面积方法:");

            Console.WriteLine("请输入圆的半径!");

            r = double.Parse(Console.ReadLine());

            Shape shapes = new Circle(r);

            shapes.Area();

            Console.WriteLine();

 

            //下面将显示通过积累句柄调用圆、正方形和三角形的面积方法

            Console.WriteLine("下面将显示通过积累句柄调用圆、正方形和三角形的面积方法");

            fn(c);

            Console.ReadLine();

            fn(s);

            Console.ReadLine();

            fn(t);

            Console.ReadLine();

        }

        static void fn(Shape shapes)

        {

            shapes.Area();

        }

    }

class Tringle:Shape

    {

        private double length;

        private double s;

        private double height;

 

        public Tringle()

        {

            length = 10;

           

            height = 9;

        }

        public Tringle(double length, double height)

        {

            this.length = length;

           

            this.height = height;

        }

 

        public double Length

        {

            get { return length; }

            set { length = value; }

        }

      

        public double Height

        {

            get { return height; }

            set { height = value; }

        }

        public override void Area()

        {

            s = (length * height) / 2.0;

            Console.WriteLine("三角形的面积是"+ s);

        }

    }

选做设计题:定义一个名为Ipoint的接口,该接口中定义了两个属性IX,IY;这两个属性分别用于描述一个点的x坐标和y坐标。

定义接口的派生类MyPoint,具体实现在接口中定义的两个属性.定义一个PrintPoint方法来输出类的IX和IY属性。

class MyPoint:IPoint

    {

        double x,y;

 

        public double IX

        {

            get { return x; }

            set { x = value; }

 

        }

        public double IY

        {

            get { return y; }

            set { y = value; }           

        }

        public void PrintPoint()

        {

            Console.WriteLine("X: {0}, Y: {1}", x, y);

        }

 

    }

class Program

    {

        static void Main(string[] args)

        {

            MyPoint myPoint = new MyPoint();

            myPoint.IX = 10;

            myPoint.IY = 100;

            myPoint.PrintPoint();

            Console.WriteLine();

 

            IPoint iPoint =myPoint ;

            iPoint.IX = 15;

            iPoint.IY = 150;

            myPoint.PrintPoint();

        }

    }

 

    interface IPoint

    {

        double IX

        {

            get;

            set;

        }

 

        double IY

        {

            get;

            set;

        }

 

    }

三 实习小节

本次实验难度较大,在老师的指导和同学的帮助下,我掌握了类和对象以及构造函数的定义及应用,理解了C#中访问修饰符的作用,并且能够掌握属性及索引器的定义及应用,能掌握接口及抽象类的定义及应用。继承与多态机制,在测试类中,分别通过创建派生类的实例调用各自面积方法,定义一个调用派生类的求其面积的方法,参数为基类的句柄,分别通过将基类的句柄指向派生类的实例来调用面积求解方法。这次实验的难度又大了一些,而且题目量也增多了一些,我在这次实验中不是很顺利,几个程序无法运行,在同学的帮助下在才算解决。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有