接口里面的静态方法--痒啊
最近在开发字典,这个命题其实也不是从开发字典开始想到的,由来已久的问题,只是以前没有太在意,现在觉得接口里面静态方法虽然可以用其他方案代替,不过总觉得有些不爽。
考察一下下面这样的一个场景:
所有字典都有差不多的属性,例如字典名称,字典类型,使用的数据库等等:
/// Summary description for Dictionary
/// </summary>
public class DictEntry
{
/// <summary>
/// 数据库
/// </summary>
public DBHelper.enmDBName DataBase;
/// <summary>
/// 字典类型
/// </summary>
public DictionaryManager.DictionaryType DictType;
/// <summary>
/// 启用标志
/// </summary>
public Boolean Enable;
/// <summary>
/// 单词名称
/// </summary>
public String DictionaryTitle;
/// <summary>
/// 单词来源
/// </summary>
public String Author;
}
下面看看每本字典的方法:
我们可以查询字典获得一个HTML字符串的结果,也可以获得一个自定义类得结果集。当然这些行为是每种字典都应该有的共同行为,同时,按照我的设计,应该都是静态的。可能是我学习的不够,我认为静态的方法就是那些不依赖于具体实例,一个类固有的方法:那么我的接口应该是这个样子的:
{
void GenerateHtml(List<T> SearchResult, GenerateInterface mGenerateInf);
List<T> GetResultByKeyword(String KeyWord);
T GetResultByID(String ID);
}
这里的泛型T是每种字典的检索结果,是一个自定义的类型。
到这里一切都没有什么问题,下面看看具体的类吧:
using System.Collections.Generic;
using System.Web;
using System.Data.OleDb;
using System.Data;
using System.IO;
using System.Xml.Serialization;
/// <summary>
/// 中日词典
/// </summary>
[Serializable]
public class CEDictResultEntry
{
public String SimpleChinese = String.Empty;
public String TrandtionChinese = String.Empty;
public String PinYin = String.Empty;
public String PinYinExtend = String.Empty;
public String English = String.Empty;
/// <summary>
/// 序列化
/// </summary>
/// <param name="filename"></param>
public void Save(String filename)
{
FileStream fs = null;
fs.Close();
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public static CEDictResultEntry load(String filename)
{
FileStream fs = null;
return t;
}
}
/// <summary>
/// Summary description for CEDict
/// </summary>
public class CEDict : DictEntry,IDictEntry<CEDictResultEntry>
{
/// <summary>
/// 根据关键字获得结果
/// </summary>
/// <param name="strKeyWord"></param>
/// <returns></returns>
public List<CEDictResultEntry> GetResultByKeyword(String strKeyWord)
{
List<CEDictResultEntry> result = new List<CEDictResultEntry>();
OleDbConnection mConnection = DBHelper.GetConnection(DBHelper.enmDBName.CEDict);
try
{
return result;
}
/// <summary>
/// 生成HTML页面结果
/// </summary>
/// <param name="SearchResult"></param>
/// <param name="mGenerateInf"></param>
public void GenerateHtml(List<CEDictResultEntry> SearchResult, GenerateInterface mGenerateInf)
{
if (SearchResult.Count == 0) { return; }
mGenerateInf.strSearchResult.AppendLine("</ul>");
}
public CEDictResultEntry GetResultByID(string ID)
{
throw new NotImplementedException();
}
}
换句话说,它们必须是某个实例才能使用的方法,这个和设计的本意相反,它们应该是固有的,类似于工具类的方法。
刚才找出了博客园的老前辈的一篇文章,里面有这么一段令人回味:
[你必须知道的.NET] 第二回:对抽象编程:接口和抽象类 :
- 什么是接口?
接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引 器、静态方法、静态字段、静态构造函数以及常数。但是注意:C#中不能包含任何静态成员。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现 该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。
我使用接口的原因是为了能够
1.将字典作为即插即用的统一管理的部件
2.让编译器告诉我缺失的方法
C#不能使用静态接口的原因,可能在深层次的方法表,对象继承结构中,可能造成歧义的原因。但是,如果用设计角度说,我无法理解为什么不能有静态方法。
我也不知道有什么好的方法来解决这个问题。。。。。