[原创]使用接口还是使用抽象类?_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > [原创]使用接口还是使用抽象类?

[原创]使用接口还是使用抽象类?

 2013/10/17 21:21:01  精简的美丽  博客园  我要评论(0)
  • 摘要:在使用C#的时候,经常会用到集合,惯用的做法是实例化一个List或Collection,然后存放东西就行了。我总是很懒,所以把Collection封装了一下,加了个锁,可以线程安全的访问了。这位看官说了:你说的是集合,跟你的标题扯不上关系吧?是的,到目前为止是的。然而,当我们遇到这样的问题时:N多个类有相同的属性或方法。这个时候你第一想到的是接口。没错,接口可以很好的表述你的要求。但我要说,请稍等。你可以使用接口,那么为什么不试试抽象类呢?定义一个接口,其所有的属性与方法
  • 标签:原创 使用 接口 抽象

在使用C#的时候,经常会用到集合,惯用的做法是实例化一个List或Collection,然后存放东西就行了。我总是很懒,所以把Collection封装了一下,加了个锁,可以线程安全的访问了。

这位看官说了:你说的是集合,跟你的标题扯不上关系吧?

是的,到目前为止是的。然而,当我们遇到这样的问题时:N多个类有相同的属性或方法。这个时候你第一想到的是接口。没错,接口可以很好的表述你的要求。但我要说,请稍等。

你可以使用接口,那么为什么不试试抽象类呢?

定义一个接口,其所有的属性与方法,你都要在实现类中全部重现。

使用抽象类,在抽象基类里可以实现一些属性或方法,子类只需要重载特殊的属性或方法即可。

不管从实用性还是代码简洁性,抽象类,在我看来是首选。

这也是我不同意下面一个帖子里使用接口的原因。

C# 泛型类型必须继承接口的问题

好了,下面放一个我自己写的泛型抽象基类,其使用方法

class="postTitle">原创 C# 正则表达式 读写 Ini 文件

namespace goldli.Utility.Library
{
    /// <summary>
    /// 泛型集合类,子元素拥有默认new构造函数
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public abstract class Collection<T> : CollectionBase //where T : class ,new()
    {
        /// <summary>
        /// 泛型是否默认值
        /// 对泛型实例与默认值比较使用 Equals
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public bool IsDefault(T item)
        {
            return Equals(item, default(T));
        }
 
        /// <summary>
        /// 添加,item可以为null,方便大量添加后赋值
        /// </summary>
        /// <param name="item"></param>
        public void Add(T item)
        {
            Lock();
            try
            {
                List.Add(item);
                Selected = item;//同时选中
            }
            finally
            {
                UnLock();
            }
        }
 
        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="item"></param>
        public void Remove(T item)
        {
            var tmp = Find(item);
            if (IsDefault(tmp)) throw new ArgumentNullException("type " + typeof(T).Name + " is null.");
            Lock();
            try
            {
                List.Remove(tmp);
            }
            finally
            {
                UnLock();
            }
        }
 
        public T this[int index]
        {
            get
            {
                Lock();
                T result;
                try
                {
                    result = (0 <= index) && (index < Count) ? (T)InnerList[index] : default(T);
                }
                finally
                {
                    UnLock();
                }
                return result;
            }
        }
 
        /// <summary>
        /// 查找
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public abstract T Find(object value);
 
        /// <summary>
        /// 选择的某个item
        /// </summary>
        public T Selected { getset; }
 
        #region 线程安全
 
        /// <summary>
        /// 上锁
        /// </summary>
        public void Lock()
        {
            Monitor.Enter(List);
        }
 
        /// <summary>
        /// 解锁
        /// </summary>
        public void UnLock()
        {
            Monitor.Exit(List);
        }
 
        #endregion
 
        /// <summary>
        /// 公开IList
        /// </summary>
        public new IList List { get { return base.List; } }
    }
}
发表评论
用户名: 匿名