实现接口有什么好处,欢迎大家来讨论一下,适当的代码举例子,顺便简单说说IList之类的东东
解决方案 »
- 酒店管理后台用户身份识别的问题
- 把网站上传到空间,web.config是应该改一下的吧,怎么改呀?我是初学者不大明白,跪求大侠指点。
- 怎么写数据提交成功后,页面就会关闭?
- 网上下载的防治SQL注入的代码,有点问题,大家帮帮忙。
- ajax AutoCompleteExtender 控件动态绑定的问题
- 问些关于修改系统的问题?
- @@@@@@@@@@@@@realplay不能这样设置吗?@@@@@@@@@@@@@
- 滚动新闻
- 孟子E章的DataGrid分页例子里,怎么在首页的时候,“首页”不显示链接?
- 一个asp.net的编译错误“无法识别的转义序列”,紧急求助!!!???
- 怎么部署Web Developer 2005开发的asp.net程序?
- ·protected System.Web.UI.WebControls.LinkButton LinkButton1;把控件拖放到页面就有这句话,这句话的用protected意义何在?为什么要用
而java,C#等面向对象语言支持抽象的机制为 抽象类和接口,接口拥有更大的灵活性.
我举一个小例子,不太完善,希望能给你一些启发.
比如我们要做一个购书系统,购书后,需要进行打折,我们就来实现打折这一部分:using System;namespace InterfaceSample
{
/// <summary>
/// 表示一本书
/// </summary>
class Book
{
/// <summary>
/// 书名
/// </summary>
public string Name;
/// <summary>
/// 价格
/// </summary>
public decimal Money;
} /// <summary>
/// 书价打折接口(接口就像一个协议,你不用知道协议后面是什么,只需要知道它遵守了这个协 议),在这里,我们只知道这个接口会进行打折计算
/// </summary>
interface IBookMoneyComputer
{
/// <summary>
/// 计算书价
/// </summary>
/// <param name="books">要计算价格的书目</param>
/// <param name="totalMoney">书的总价格(打折前的)</param>
/// <returns></returns>
decimal Compute(Book[] books, decimal totalMoney);
} //我们来实现两个打折器(构造两个类来实现IBookMoneyComputer接口)------------------ /// <summary>
/// 总价打折器,只要书总价超过500, 我们就给它减去100
/// </summary>
class TotalMoneyComputer : IBookMoneyComputer
{
#region IBookMoneyComputer 成员 public decimal Compute(Book[] books, decimal totalMoney)
{
if (totalMoney > 500)
return totalMoney - 100;
return totalMoney;
} #endregion
}
/// <summary>
/// 书类别打折器,只要有一本书名为"DotNet",我们就给总价减去50
/// </summary>
class BookTypeComputer : IBookMoneyComputer
{
#region IBookMoneyComputer 成员 public decimal Compute(Book[] books, decimal totalMoney)
{
foreach (Book book in books)
{
if (book.Name == "DotNet")
return totalMoney - 50;
}
return totalMoney;
} #endregion
}//----------------------------------------------------------------
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 表态方法,接受一个book数组,和一个打折器,注意,我们这个参数是接口类型
/// </summary>
/// <param name="books"></param>
/// <param name="computer"></param>
/// <returns></returns>
static decimal ComputeMoney(Book[] books, IBookMoneyComputer computer)
{
//注意,这里的计算打折前的总价程序不需要进行抽象
decimal totalMoney = 0m;
foreach (Book book in books)
{
totalMoney += book.Money;
}
//用接口类型进行打折,这样有很大的灵活性,可以随时更改打折策略
return computer.Compute(books, totalMoney);
} /// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//我们来购造三本书
Book book1 = new Book();
book1.Name = "aaa";
book1.Money = 200; Book book2 = new Book();
book2.Name = "bbb";
book2.Money = 400; Book book3 = new Book();
book3.Name = "DotNet";
book3.Money = 200; //可以分别运行两种打折策略来进行打折
Console.WriteLine(ComputeMoney(new Book[] { book1, book2, book3 }, new TotalMoneyComputer()));
Console.WriteLine(ComputeMoney(new Book[] { book1, book2, book3 }, new BookTypeComputer()));
Console.Read();
}
}
}
至于你说的实现.net类库中的接口有什么好处,你可以想象一下,只要有接口,就有调用接口的地方,这就像本例一样,为了取得灵活性(对于那个调用者来说)设计方面 的知识太多太多了,不是一个小例子能说完的.建议还是多看一些关于设计层面的书