• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
编写人生
写写代码,写写人生
博客园    首页    新随笔    联系   管理    订阅  订阅
为什么C#的范型不能自动实现此接口
文章讨论一个关于范型的Collection自动实现范型的ICollection接口的问题 点击标题查看正文。
问题比较复杂,先看看一个图先:
 
本来我的程序包含Column和他的集合ColumnCollection,可以通过名称检索不同的列。
现在我要重构这段代码,我发现我的程序中包含很多通过名称检索数据的集合类,于是我定义了一个INamedObject接口,用来处理所有有名称的数据。
    public interface INamedObject {
        
string Name { get;}
    }
并且定义了一个只读的集合类接口,用来检索有名称的数据。
    public interface INamedCollection<T> : IEnumerable<T> where T : INamedObject {
        
int Count { get; }
        
bool ContainsName(string pName);
        T 
this[int pIndex] { get;}
        T 
this[string pName] { get;}
    }
当然了,有接口,就有一个基础实现:NamedCollection
    public class NamedCollection<T>
    : Collection
<T>, INamedCollection<T> where T : INamedObject {

        
private Dictionary<string, T> _nameIndex;

        
public NamedCollection() {
            _nameIndex 
= new Dictionary<string, T>();
        }


        
protected override void InsertItem(int index, T item) {
            
base.InsertItem(index, item);
            _nameIndex.Add(item.Name, item);
        }


        
protected override void RemoveItem(int index) {
            
string removeItemName = this[index].Name;
            
base.RemoveItem(index);
            _nameIndex.Remove(removeItemName);
        }


        
protected override void SetItem(int index, T item) {
            
throw new NotSupportedException();
        }


        
protected override void ClearItems() {
            
base.Clear();
            _nameIndex.Clear();
        }


        
public bool ContainsName(string pName) {
            
return _nameIndex.ContainsKey(pName);
        }


        
public T this[string pName] {
            
get { return _nameIndex[pName]; }
        }

    }
关于Column和Collection我也提取成了接口的形式,定义如下:
    public interface IColumn : INamedObject {
        System.Data.DbType DbType 
{ get;}
    }


    
public interface IColumnCollection : INamedCollection<IColumn> { }

Column实现了IColumn接口,非常的简单,就不罗嗦了。
    public class Column : IColumn {
        
public Column(string pName, System.Data.DbType pDbType) {
        }


        
private string _name;
        
public string Name {
            
get { return _name; }
        }


        
private System.Data.DbType _dbType;
        
public System.Data.DbType DbType {
            
get { return _dbType; }
        }

    }

好,终于可以将正题了,我现在想实现让ColumnCollection实现IColumnCollection,代码如下:

public class ColumnCollection : NamedCollection<Column>,IColumnCollection {}

很可惜的是,Vs2005下的C#认为我的NamedCollection<Column>没有实现:IColumnCollection的实现:

Error 1 'ConsoleApplication1.ColumnCollection' does not implement interface member 'ConsoleApplication1.INamedCollection<ConsoleApplication1.IColumn>.this[int]'. 'System.Collections.ObjectModel.Collection<T>.this[int]' is either static, not public, or has the wrong return type. C:\Documents and Settings\Steve\Local Settings\Application Data\Temporary Projects\ConsoleApplication1\Program.cs 83 15 ConsoleApplication1
Error 2 'ConsoleApplication1.ColumnCollection' does not implement interface member 'ConsoleApplication1.INamedCollection<ConsoleApplication1.IColumn>.this[string]'. 'ConsoleApplication1.NamedCollection<T>.this[string]' is either static, not public, or has the wrong return type. C:\Documents and Settings\Steve\Local Settings\Application Data\Temporary Projects\ConsoleApplication1\Program.cs 83 15 ConsoleApplication1
Error 3 'ConsoleApplication1.ColumnCollection' does not implement interface member 'System.Collections.Generic.IEnumerable<ConsoleApplication1.IColumn>.GetEnumerator()'. 'System.Collections.ObjectModel.Collection<ConsoleApplication1.Column>.GetEnumerator()' is either static, not public, or has the wrong return type. C:\Documents and Settings\Steve\Local Settings\Application Data\Temporary Projects\ConsoleApplication1\Program.cs 83 15 ConsoleApplication1


有哪位大侠讲讲MS为什么这样设计


此问题在已经有贴基本解决。

posted on 2005-07-26 16:10  编写人生  阅读(2450)  评论(4)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3