黑马程序员技术交流社区
标题: 关于抽象类 和接口的疑问 [打印本页]
作者: 赵贺景 时间: 2014-5-10 12:37
标题: 关于抽象类 和接口的疑问
本帖最后由 赵贺景 于 2014-5-10 16:37 编辑
使用抽象类来实现,计算圆形和矩形的面积和周长。要求:写一个”Shape”类作为圆形和矩形的父类,提供两个抽象方法,分别用来计算周长和面积,子类圆形和矩形分别在自己的类中重写父类的抽象方法
这个问题是不是有两种思路,一种就是抽象类 另外一个可以用接口实现,抽象类的我能理解 但是接口的实现方法 表示卡壳了。求指导
作者: leayon 时间: 2014-5-10 13:57
题目不是说用抽象类来实现吗?抽象类跟接口是不一样的,接口比抽象类更加抽象化。如果使用接口实现的话,最好让接口的功能单一,比如计算面积的接口如下:
public interface ICalcArea(){
void CalcArea();
}
然后让一个类实现这个接口计算面积的方法,最后通过接口变量来调用这个方法就可以计算面积了。
作者: 一片白 时间: 2014-5-10 14:20
本帖最后由 一片白 于 2014-5-10 14:24 编辑
一、抽象类实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _27
{
class Program
{
static void Main(string[] args)
{
//圆形
Shape shape1 = new Circle(3.0);
Console.WriteLine("面积是:" + shape1.CalculateArea());
Console.WriteLine("周长是:" + shape1.CalculatePerimeter());
//矩形
Shape shape2 = new Retangle(4, 7.3);
Console.WriteLine("面积是:" + shape2.CalculateArea());
Console.WriteLine("周长是:" + shape2.CalculatePerimeter());
Console.ReadKey();
}
}
//抽象类 Shape
abstract class Shape
{
public double Area { get; set; } //面积属性
public double Perimeter { get; set; } //周长
public abstract double CalculateArea();//计算面积的方法
public abstract double CalculatePerimeter();//计算周长
}
//圆形
class Circle : Shape
{
//属性:半径
public double r { get; set; }
//构造函数
public Circle(double r)
{
this.r = r;
}
//重写 计算面积的方法
public override double CalculateArea()
{
this.Area = Math.PI * r * r;
return this.Area;
}
public override double CalculatePerimeter()
{
this.Perimeter = 2 * Math.PI * r;
return this.Perimeter;
}
}
//矩形
class Retangle : Shape
{
public double height { get; set; }
public double width { get; set; }
//构造函数
public Retangle(double height, double width)
{
this.height = height;
this.width = width;
}
public override double CalculateArea()
{
this.Area = height * width;
return this.Area;
}
public override double CalculatePerimeter()
{
this.Perimeter = (height + width) * 2;
return this.Perimeter;
}
}
}
二、接口实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _27_2
{
class Program
{
static void Main(string[] args)
{
ICalculateArea area1 = new Circle(3);
ICalculateArea area2 = new Retangle(2, 3.33);
Console.WriteLine("area1的面积是" + area1.CalculateArea());
Console.WriteLine("area2的面积是" + area2.CalculateArea());
ICalculatePerimeter p1 = new Circle(3);
ICalculatePerimeter p2 = new Retangle(2, 3.33);
Console.WriteLine("area1的周长是" + p1.CalculatePerimeter());
Console.WriteLine("area2的周长是" + p2.CalculatePerimeter());
Console.ReadKey();
}
}
//接口 面积
interface ICalculateArea
{
double CalculateArea();
}
//接口 周长
interface ICalculatePerimeter
{
double CalculatePerimeter();
}
//圆形
class Circle : ICalculateArea, ICalculatePerimeter
{
//属性:半径
public double r { get; set; }
//构造函数
public Circle(double r)
{
this.r = r;
}
public double CalculateArea()
{
return Math.PI * r * r;
}
public double CalculatePerimeter()
{
return 2 * Math.PI * r;
}
}
//矩形
class Retangle : ICalculateArea, ICalculatePerimeter
{
public double height { get; set; }
public double width { get; set; }
//构造函数
public Retangle(double height, double width)
{
this.height = height;
this.width = width;
}
public double CalculateArea()
{
return height * width;
}
public double CalculatePerimeter()
{
return (height + width) * 2;
}
}
}
{:3_51:}自己的见解,也不知道是否完全正确。
黑马朋友,共同学习!
作者: 亚伦 时间: 2014-5-10 14:28
- class Shape
- {
- }
- class Hexagon : Shape, IPointy
- {
- public int Points
- {
- get { return 6; }
- }
- }
- class Circle : Shape
- {
- }
- class Triangle : Shape, IPointy
- {
- public int Points
- {
- get { return 3; }
- }
- }
复制代码- public interface IPointy
- {
- int Points { get; }
- }
复制代码
感觉有点像《精通C#》的题目,你是不是想要这种效果。
作者: 赵贺景 时间: 2014-5-10 16:00
这个题目考查的是父类中的抽象方法不能被直接调用 子类要重写才能调用
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |