博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
接口里面的静态方法--痒啊
阅读量:6264 次
发布时间:2019-06-22

本文共 3115 字,大约阅读时间需要 10 分钟。

最近在开发字典,这个命题其实也不是从开发字典开始想到的,由来已久的问题,只是以前没有太在意,现在觉得接口里面静态方法虽然可以用其他方案代替,不过总觉得有些不爽。

考察一下下面这样的一个场景:

      所有字典都有差不多的属性,例如字典名称,字典类型,使用的数据库等等:

///
 
<summary>
///
 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字符串的结果,也可以获得一个自定义类得结果集。当然这些行为是每种字典都应该有的共同行为,同时,按照我的设计,应该都是静态的。可能是我学习的不够,我认为静态的方法就是那些不依赖于具体实例,一个类固有的方法:那么我的接口应该是这个样子的:

 

public
 
interface
 IDictEntry
<
T
>
{
    
void
 GenerateHtml(List
<
T
>
 SearchResult, GenerateInterface mGenerateInf);
    List
<
T
>
 GetResultByKeyword(String KeyWord);
    T GetResultByID(String ID);
}

 这里的泛型T是每种字典的检索结果,是一个自定义的类型。

到这里一切都没有什么问题,下面看看具体的类吧:

 

using
 System;
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();
    }
}

 

 

GetResultByKeyword方法和
GenerateHtml不能是静态的方法。

换句话说,它们必须是某个实例才能使用的方法,这个和设计的本意相反,它们应该是固有的,类似于工具类的方法。

刚才找出了博客园的老前辈的一篇文章,里面有这么一段令人回味:

  • 什么是接口?

接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引 器、静态方法、静态字段、静态构造函数以及常数。但是注意:C#中不能包含任何静态成员。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现 该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。

     我使用接口的原因是为了能够

     1.将字典作为即插即用的统一管理的部件

     2.让编译器告诉我缺失的方法

 

C#不能使用静态接口的原因,可能在深层次的方法表,对象继承结构中,可能造成歧义的原因。但是,如果用设计角度说,我无法理解为什么不能有静态方法。

我也不知道有什么好的方法来解决这个问题。。。。。

 

 

 

转载地址:http://pqdpa.baihongyu.com/

你可能感兴趣的文章
appium封装显示等待Wait类和ExpectedCondition接口
查看>>
Android 全局弹出版本更新 Dialog 思考和解决办法
查看>>
IDEA在当前类中查找方法快捷键--转
查看>>
初识少儿编程
查看>>
浏览器 UA 判断
查看>>
理解OAuth 2.0
查看>>
高并发处理思路与手段(三):消息队列
查看>>
Docker+Nginx部署Angular
查看>>
Docker & ASP.NET Core (4):容器间的连接
查看>>
beam 的异常处理 Error Handling Elements in Apache Beam Pipelines
查看>>
将png图片转换为字体图标
查看>>
/var/log/wtmp
查看>>
C# 获取机器码
查看>>
什么是医嘱?医嘱的书写内容?
查看>>
如何通过CSP编程卸载Windows Mobile应用程序
查看>>
用delphi实现完美屏幕截图
查看>>
matlab练习程序(差异演化DE)
查看>>
这就是搜索引擎:核心技术详解
查看>>
加解密技术处理时间对比
查看>>
g++命令行详解 (转)
查看>>