C#大学课程(第五版)课后习题12.10Shape层次
/*12.10
(Shape层次)实现图11.3中的Shape 层次。忽略Triangle 类和Tetrahedron 类。每个TwoDimensionalShape应当包含只读抽象属性Area,它计算二维形体的面积。每个ThreeDimensionalShape应当包含只读属性Area和Volume,它们分别计算三维形体的表面积和体积。创建一个程序利用Shape数组引用层次中每一个具体类的对象,输出每个数组元素引用的对象的文本描述,此外,在处理数组中所有形体的循环中,需判断形体是TwoDimensionalShape 还是ThreeDimensionalShape。如果为TwoinensioalShape,则显示它的面积; 如果为ThreeDimnsionalShape,则显示它的表面积和体积。
*/
using System;
public class Circle : TwoDimensionalShape
{
public Circle( int x, int y, int radius )
: base( x, y, radius, radius ) { }
public override string Name
{
get
{
return "Circle";
}
}
public override double Area
{
get
{
return ( Math.PI * Radius * Radius );
}
}
public int Radius
{
get
{
return Dimension1;
}
set
{
Dimension1 = value;
Dimension2 = value;
}
}
public override string ToString()
{
return string.Format( "{0} {1}: {2}\n",
base.ToString(), "radius", Radius );
}
}
public class Cube : ThreeDimensionalShape
{
public Cube( int x, int y, int side )
: base( x, y, side, side, side ) { }
public override string Name
{
get
{
return "Cube";
}
}
public override double Area
{
get
{
return ( 6 * Side * Side );
}
}
public override double Volume
{
get
{
return ( Side * Side * Side );
}
}
public int Side
{
get
{
return Dimension1;
}
set
{
Dimension1 = value;
Dimension2 = value;
Dimension3 = value;
}
}
public override string ToString()
{
return string.Format( "{0} {1}: {2}\n",
base.ToString(), "side", Side );
}
}
public abstract class Shape
{
public int X { get; set; }
public int Y { get; set; }
public Shape( int x, int y )
{
X = x;
Y = y;
}
public override string ToString()
{
return string.Format( "[{0}, {1}]", X, Y );
}
public abstract string Name
{
get;
}
}
using System;
public class Sphere : ThreeDimensionalShape
{
public Sphere( int x, int y, int radius )
: base( x, y, radius, radius, radius ) { }
public override string Name
{
get
{
return "Sphere";
}
}
public override double Area
{
get
{
return ( 4 * Math.PI * Radius * Radius );
}
}
public override double Volume
{
get
{
return ( 4.0 / 3.0 * Math.PI *
Radius * Radius * Radius );
}
}
public int Radius
{
get
{
return Dimension1;
}
set
{
Dimension1 = value;
Dimension2 = value;
Dimension3 = value;
}
}
public override string ToString()
{
return string.Format( "{0} {1}: {2}\n",
base.ToString(), "radius", Radius );
}
}
public class Square : TwoDimensionalShape
{
public Square( int x, int y, int side )
: base( x, y, side, side ) { }
public override string Name
{
get
{
return "Square";
}
}
public override double Area
{
get
{
return Side * Side;
}
}
public int Side
{
get
{
return Dimension1;
}
set
{
Dimension1 = value;
Dimension2 = value;
}
}
public override string ToString()
{
return string.Format( "{0} {1}: {2}\n",
base.ToString(), "side", Side );
}
}
public abstract class ThreeDimensionalShape : Shape
{
public int Dimension1 { get; set; }
public int Dimension2 { get; set; }
public int Dimension3 { get; set; }
public ThreeDimensionalShape( int x, int y, int d1,
int d2, int d3 )
: base( x, y )
{
Dimension1 = d1;
Dimension2 = d2;
Dimension3 = d3;
}
public abstract double Area
{
get;
}
public abstract double Volume
{
get;
}
}
public abstract class TwoDimensionalShape : Shape
{
public int Dimension1 { get; set; }
public int Dimension2 { get; set; }
public TwoDimensionalShape( int x, int y, int d1, int d2 )
: base( x, y )
{
Dimension1 = d1;
Dimension2 = d2;
}
public abstract double Area
{
get;
}
}
using System;
public class ShapeTest
{
public static void Main( string[] args )
{
Shape[] shapes = new Shape[ 4 ];
shapes[ 0 ] = new Circle( 22, 88, 4 );
shapes[ 1 ] = new Square( 71, 96, 10 );
shapes[ 2 ] = new Sphere( 8, 89, 2 );
shapes[ 3 ] = new Cube( 79, 61, 8 );
foreach ( var currentShape in shapes )
{
Console.Write( "{0}: {1}",
currentShape.Name, currentShape );
if ( currentShape is TwoDimensionalShape )
{
TwoDimensionalShape twoDimensionalShape =
( TwoDimensionalShape ) currentShape;
Console.WriteLine( "{0}'s area is {1}",
currentShape.Name, twoDimensionalShape.Area );
}
if ( currentShape is ThreeDimensionalShape )
{
ThreeDimensionalShape threeDimensionalShape =
( ThreeDimensionalShape ) currentShape;
Console.WriteLine( "{0}'s area is {1}",
currentShape.Name, threeDimensionalShape.Area );
Console.WriteLine( "{0}'s volume is {1}",
currentShape.Name,
threeDimensionalShape.Volume );
}
Console.WriteLine();
}
}
}

浙公网安备 33010602011771号