练习
练习1:形状类Shape(父类),包含Size属性和计算面积getArea()方法。圆类Circle继承Shape,可以计算圆的面积。正方形类Square继承Shape,可以计算正方形面积。最终要求能实现:Shape sh=new Circle(5);sh.getArea()能计算出圆的面积。Shape sh=new Square(5);sh.getArea()能计算出正方形的面积。
namespace 计算面积
{
class Program
{
static void Main(string[] args)
{
Shape shape1 = new Circle(5);
Console.WriteLine(shape1.getArea());
Shape shape2 = new Square(10, 10);
Console.WriteLine(shape2.getArea());
Console.ReadKey();
}
}
/// <summary>
/// 形状类
/// </summary>
abstract class Shape
{
private double _width;
/// <summary>
/// 宽í
/// </summary>
public double Width
{
get { return _width; }
set { _width = value; }
}
private double _height;
/// <summary>
/// 长¤
/// </summary>
public double Height
{
get { return _height; }
set { _height = value; }
}
public abstract double getArea();//抽é象ó方?法ぁ?
}
/// <summary>
/// 圆2类え?
/// </summary>
class Circle : Shape
{
public Circle(double r)
{
this.Height=r;
this.Width=r;
}
/// <summary>
/// 计?算?圆2的?面?积y
/// </summary>
/// <returns></returns>
public override double getArea()
{
return this.Height * this.Width*Math.PI;
}
}
class Square : Shape
{
public Square(double w,double h)
{
this.Height = h;
this.Width = w;
}
/// <summary>
/// 计算正方形的面积
/// </summary>
/// <returns></returns>
public override double getArea()
{
return this.Height * this.Width;
}
}
}
Abstract
//抽象类不能被实例化
//如果一个类中有任何抽象成员,那么这个类也必须是抽象类abstract class
//子类继承抽象类后,必须重写父类中的所有抽象成员,除非子类也是一个抽象类
//抽象成员在抽象类中不能有任何实现。
//抽象类中可以有抽象成员也可以有非抽象成员.
学习ToString()方法、Equals()来自于Object,任何类都有,通过override有了不同的实现(举例,自己的类实现ToString())
tatic void Main(string[] args)
{
Circle c1 = new Circle(10);
Console.WriteLine(c1.ToString());
Console.ReadKey();
}
这样黑框显示:
因为:
To.string我们没写这个方法但是显示,是因为任何类继承object的tostring
即abstract class Shape:Object //不写,默认继承了。
那么这个cricle继承object么
class Circle : Shape
C#中是单继承,在这里circle是单继承,类的继承也是两个东西的关系。Object继承给shape,而shape继承给circle。
Tostring原来是个virtual虚方法,而子类未重写标记为virtual的tostnig方法?????默认吊的object的实现,所以返回的是这个 类型名称。
所以他就指指向了上图的。
如果不想
我们进行对tostring的重写
public override string ToString()
{
//return base.ToString();
return getArea().ToString();
}
输出正确。
思考:父类到底要不要写成抽象类?
看实际情况,父类不会被实例化的的时候不用。抽象类就是让子类去继承的,自己本身么有用。
抽象类的意义:不能从抽象类创建对象,它的意义在于被扩展。代码重用、多态(简化了is DataType的判断)。
普通类的继承能实现多态吗?
方法重写的意义(最终的意义就是多态):为所有子类定义了某种规范(某种必须有的规范),多态。//这里的规范可以理解为”行为“,就是方法。//以后用到得接口等中提到的规范,其实目的就是让新增加的类必须具有某些方法,这样才能满足我们程序中的要求。(对程序扩展做了一定的约束。)