zoukankan      html  css  js  c++  java
  • 接口里面的静态方法痒啊

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

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

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

    /// <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不能是静态的方法。

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

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

    [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类

    • 什么是接口?

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


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

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

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

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

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

  • 相关阅读:
    【SR汇总】基于传统方法
    漫展被骗
    SRCNN代码分析
    【SR汇总】效果对比
    【SR汇总】算法时间效率
    根据wsdl文件,Java工程自动生成webservice客户端调用
    Python3 Selenium WebDriver网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作
    Python3 Selenium自动化-select下拉框
    Python3 ChromeDriver与Chrome版本映射表(更新至v2.43)
    Python3 Selenium自动化测试赋值出现:WebDriverException: Message: unknown error: call function result missing 'value'
  • 原文地址:https://www.cnblogs.com/TextEditor/p/2168586.html
Copyright © 2011-2022 走看看