当前位置:编程学习 > C#/ASP.NET >>

C# 利用接口实现圆的周长和面积?

答案: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#吗??谢谢

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,