一 实习目的
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#中访问修饰符的作用,并且能够掌握属性及索引器的定义及应用,能掌握接口及抽象类的定义及应用。继承与多态机制,在测试类中,分别通过创建派生类的实例调用各自面积方法,定义一个调用派生类的求其面积的方法,参数为基类的句柄,分别通过将基类的句柄指向派生类的实例来调用面积求解方法。这次实验的难度又大了一些,而且题目量也增多了一些,我在这次实验中不是很顺利,几个程序无法运行,在同学的帮助下在才算解决。
加载中,请稍候......