怎么样去理解抽象类

2018-06-17 20:32:48来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

      假如很多人要买水果吃,吃的动作只有一个,但是有的人要用现金买,有的人用信用卡,有的人赊帐。要为每个人定义一个类,就要定义多个相同的吃的方法。如果定义一个抽象类,在里面实现吃的方法,再做一个买的抽象方法。那每个人的类都从这个抽象类派生下来,只要实现买的方法即可,吃的方法就可以直接用父类的方法了。如果要改吃的方法就不用改多个,只要改这个抽象类里的就行了。    

 

一个接口:

  public interface IGrabber
    {
        /// <summary>
        /// 是否可用。
        /// </summary>
        bool Enabled
        {
            get;
            set;
        }

        /// <summary>
        /// 抓取器名。
        /// </summary>
        string Name
        {
            get;
            set;
        }

        /// <summary>
        /// 源字符串最大长度。
        /// </summary>
        uint MaxSourceLength
        {
            get;
            set;
        }

        /// <summary>
        /// 源字符串最小长度。
        /// </summary>
        uint MinSourceLength
        {
            get;
            set;
        }

        /// <summary>
        /// 抓取。
        /// </summary>
        /// <param name="source">要抓取的源。</param>
        /// <param name="target">抓取结果。</param>
        /// <returns>是否抓取成功。</returns>
        bool Grab(string source, out string[] targets);

        /// <summary>
        /// 抓取。
        /// </summary>
        /// <param name="source">要抓取的源。</param>
        /// <param name="targets">抓取结果。</param>
        /// <returns></returns>
        bool Grab(IList<Keys> source, out string[] targets)

 

 一个抽象类:

  public abstract class BaseGrabber : IGrabber
    {
        #region IGrabber成员。

        public virtual bool Enabled
        {
            get;
            set;
        }

        public virtual string Name
        {
            get;
            set;
        }

        public virtual uint MaxSourceLength
        {
            get;
            set;
        }

        public virtual uint MinSourceLength
        {
            get;
            set;
        }

        public abstract bool Grab(string source, out string[] targets);

        public abstract bool Grab(IList<Keys> source, out string[] targets);

        #endregion

        /// <summary>
        /// 是否重构数据源(识别方向键、删除键等按键对输入字符的影响,返回真实的输入项)。
        /// </summary>
        public virtual bool IsRestructured
        {
            get;
            set;
        }

        protected BaseGrabber()
        {
            this.Name = this.GetType().Name;
            this.MinSourceLength = 0;
            this.MaxSourceLength = 256;
            this.Enabled = true;
            this.IsRestructured = true;
        }

        /// <summary>
        /// 重构数据源(识别方向键、删除键等按键对输入字符的影响,返回真实的输入项)。
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public virtual string RestructureSource(string source)
        {
            return source;
        }

        /// <summary>
        /// 重构数据源(识别方向键、删除键等按键对输入字符的影响,返回真实的输入项)。
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public virtual IList<Keys> RestructureSource(IList<Keys> source)
        {
            int count = source.Count;
            for (int i = 0; i < count; i++)
            {
                Keys key = source[i];
                switch (key)
                {
                    case Keys.Back:
                        source.RemoveAt(i);
                        source.RemoveAt(i - 1);
                        i -= 2;
                        count -= 2;
                        break;
                }
            }
            return source;
        }

 终于搞明白了,还是上面那个例子说的是在。从接口到抽象类,在从抽象类到类,在类到对象。这就是面向对象。

下面是有关抽象类的一些基本感念:

抽象类与抽象方法由abstract修饰

抽象方法没有方法体

抽象类的派生类必须实现抽象方法体

抽象类只能作为基类,无法实例化。

重点就在于无法实例化,而且为了代码的清晰度,方便以后修改。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:使用C#: 自动切换鼠标的左右手习惯

下一篇:C# - 函数参数的传递