C# 谈谈abstract用法 和一个简单abstract factory
abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
抽象类具有以下特性:
- 
抽象类不能实例化。
 - 
抽象类可以包含抽象方法和抽象访问器。
 - 
不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。
 - 
从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
 
在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。
抽象方法具有以下特性:
- 
抽象方法是隐式的虚方法。
 - 
只允许在抽象类中使用抽象方法声明。
 - 
因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。例如:
public abstract void MyMethod();
 - 
实现由一个重写方法override(C# 参考)提供,此重写方法是非抽象类的一个成员。
 
除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
- 
在静态属性上使用 abstract 修饰符是错误的。
 - 
在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。
 
抽象类必须为所有接口成员提供实现。
实现接口的抽象类可以将接口方法映射到抽象方法上。例如:
interface I 
{
    void M();
}
abstract class C: I 
{
    public abstract void M();
}
在具体用法如下实例:
新加一个基类:MothedBase.cs
    public abstract class MothedBase
    {
        #region Fields
        public List<string> ErrorList = new List<string>();
        public List<string> MessageList = new List<string>();
        #endregion
        #region Properties
 
        /// <summary>
        /// 
        /// </summary>
        private string ConnectString
        {
            get
            {
                return ConfigurationManager.ConnectionStrings["ConnectString"].ConnectionString;
            }
        }
        #endregion
        #region Entrance Method
        /// <summary>
        /// 
        /// </summary>
        public void ExcuteMigration()
        {
        SubmitMigration(this.SqlQueryGetAllAttachment, this.SqlQueryGetAllItems, this.SqlQueryGetFolder, this.SiteUrl);
        }
        protected abstract string SiteUrl
        {
            get;
        }
        /// <summary>
        /// 
        /// </summary>
        protected abstract bool IsMigrateToProductHomePage { get; }
        /// <summary>
        /// 
        /// </summary>
        protected abstract List<string> NeedReplaceColumn { get; }
        /// <summary>
        ///  
        /// </summary>
        protected abstract string SqlQueryGetAllItems { get; }
        /// <summary>
        /// 
        /// </summary>
        protected abstract string SqlQueryGetAllAttachment { get; }
        protected virtual string SqlQueryGetFolder { get { return null; } }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="dtOriginalData"></param>
        protected abstract void ValidateOriginalData(DataTable dtOriginalData);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="dtOriginalData"></param>
        protected abstract DataTable TransferData(DataTable dtOriginalData);
        #endregion
        #region Protected Methods
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sqlQuery"></param>
        /// <returns></returns>
        protected DataTable ExcuteOracleReader(string sqlQuery)
        {
            DataTable dtResult = new DataTable();
            if (!string.IsNullOrEmpty(sqlQuery))
            {
                OracleCommand command = null;
                IDataReader dataReader = null;
                OracleConnection conn = null;
                try
                {
                    conn = new OracleConnection(this.ConnectString);
                    conn.Open();
                    command = new OracleCommand(sqlQuery);
                    command.Connection = conn;
                    command.CommandType = CommandType.Text;
                    dataReader = command.ExecuteReader();
                    dtResult.Load(dataReader);
                }
                catch (Exception ex)
                {
                    this.ErrorList.Add(ex.Message);
                }
                finally
                {
                    if (conn.State != ConnectionState.Closed)
                    {
                        conn.Close();
                        conn.Dispose();
                    }
                    if ((dataReader != null) && (dataReader.IsClosed == false))
                    {
                        dataReader.Close();
                        dataReader.Dispose();
                    }
                    if (command != null)
                    {
                        command.Dispose();
                    }
                }
            }
            return dtResult;
        }
        #endregion
        #region Private Methods
        /// <summary>
        /// 
        /// </summary>
        /// <param name="GetAllAttachment"></param>
        /// <param name="GetAllItems"></param>
        /// <param name="TheSiteUrl"></param>
        private void SubmitMigration(string GetAllAttachment, string GetAllItems, string GetFolderItem, string TheSiteUrl)
        {
            DataTable dtAttachment = null;
            DataTable dtOriginalData = null;
            //Get data and attachment form oracle database.
            if (!string.IsNullOrEmpty(this.SqlQueryGetAllAttachment))
                dtAttachment = this.ExcuteOracleReader(GetAllAttachment);
            if (!string.IsNullOrEmpty(this.SqlQueryGetAllItems))
                dtOriginalData = this.ExcuteOracleReader(GetAllItems);
        }
        #endregion
    }
然后再加一个UseMothedBase类引用MothedBase基类,代码如下:
 public class UseMothedBase:MothedBase
    {
        protected override string SiteUrl
        {
            get { return ""; }
        }
        protected override bool IsMigrateToProductHomePage
        {
            get { return ""; }
        }
        protected override List<string> NeedReplaceColumn
        {
            get { throw new NotImplementedException(); }
        }
        protected override string SqlQueryGetAllItems
        {
            get { return ""; }
        }
        protected override string SqlQueryGetAllAttachment
        {
            get { return ""; }
        }
        protected override void ValidateOriginalData(System.Data.DataTable dtOriginalData)
        {
          
        }
        protected override System.Data.DataTable TransferData(System.Data.DataTable dtOriginalData)
        {
            return new DataTable();
        }
    }
然后再在main.cs 引用它们,代码如下:
   static void Main()
    {
      MothedBase usemoth = new UseMothedBase();
      usemoth.ExcuteMigration();
    }
就样就是一个Abstract Factory 简单用法了,可以概据各自的需求丰富下,让它使用灵活.
作者: spring yang 发表于 2011-03-17 15:21 原文链接