答案:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int i;
double radius;
double result;
Console.WriteLine("要计算圆的周长还是面积,计算周长请输入0,计算面积请输入1");
i = int.Parse(Console.ReadLine());
Console.WriteLine("请输入要计算的圆的半径");
radius = int.Parse(Console.ReadLine());
Circle cl = Factory.CreatCircle(i, radius);
result = cl.Compute();//“一个人可以做不同的事”,智能化
Console.WriteLine("计算结果是:" + result);
Console.ReadLine();
}
inte易做图ce Circle
{
double Compute();
}//接口只须有个计算(不管是面积还是周长)的方法声明就行了
class Area:Circle//计算面积的类继承接口
{
private double radius;
public Area(double r)
{
radius = r;
}
public double Compute()
{
return
3.14 * radius * radius;
}//实现真正的计算
}
class Round : Circle//与计算面积的类一样继承接口
{
private double radius;
public Round(double r)
{
this.radius = r;
}
public double Compute()
{
return 3.14 * 2 * radius;
}//实现真正的计算
}
class Factory//简单工厂
{
public static Circle CreatCircle(int i, double radius)
{
Circle cl = null;
switch (i)
{
case 0:
cl = new Round(radius);
//此处是不是会让你怀疑为什么可以“Circle cl = new Round()”呢?见注解
break;
case 1:
cl = new Area(radius);
break;
}
return cl;
}
}
}
}
/*
以上代码直接复制粘贴可运行看效果,但或许你会有些不太明白这能说明什么,且看Main()里的两条语句,Circle cl = Factory.CreatCircle(i, radius);
result = cl.Compute();
这里创建了一个接口Circle的实例cl,接着调用接口的Compute()方法得到结果。有没有发现,在Main()里我们只要知道用户想要什么结果,而无须关心自己要是计算面积或是周长只须一个cl.Compute()却能得到结果,关心是计算面积还是周长的事已经交到Factory(工厂)类里了,而事实上工厂也不关心怎么计算面积或是周长,关心它们的事已经被交到继承了Circle接口的Area跟Round两个类里去了。
这样做有什么好处呢,假设圆还有一个属性叫半周长(HalfRound),我们若要计算它,便只须再加一个类class HalfRound:CirCle{}来实现半周长的计算即可,其它地方无须再改(当然,我们要让用户知道我们已经可以计算圆的半周长了)。
是不是感觉CirCle已是无所不能的了,确实可以这么说,只要是求圆的属性,我们都可以让它来做。这正是接口的职责所在,它就是要让我们看上去一个类可以智能地做多件事一样。
而如果不用接口,而用C的面向过程编程的话,楼主可以试一下,对比两种方法所写的代码的可复用与可维护,相信你会有所发现的。
除了这点,通过以上的Factory还可以把各类的职责细分,减小类与类的关联,也就是面向对象一大要求——低偶合。
至于Circle cl = new Round()为什么可行,这就是C#的语法了,用接口声明的一个对象可以用继承了它的子类来实例化,记着就行了,这个真的没有为什么。。。
*/
上一个:C#中的TAG有什么作用哦?
下一个:学过c语言的然还需要学C++c#吗??谢谢