C#基础之抽象类的学习

C#基础之抽象类的学习

1、定义

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

2、特点

  • 不能被实例化,主要用于继承

  • 可以包含两种抽象成员,分别是抽象属性抽象方法,同时可以包含其他非抽象成员

  • 如果继承抽象类,则需实现抽象类的抽象属性和方法

  • 不能使用Sealed关键字修饰抽象类,因为Sealed意味着类无法被继承,同时Static也不能修饰抽象类

总之,抽象类是用来继承的,而继承后的子类必须按照抽象类的遗嘱来实现遗愿,即继承抽象类中所有的抽象方法和抽象属性。

简单应用示例:

(1)定义抽象类Fruit,抽象类中有公共属性vendor,抽象属性Price和抽象方法GrowArea,代码如下:

namespace AbstractClassLearn
{
    public abstract class Fruit
    {
        public string vendor { get; set; }

        public abstract float Price { get; }

        public abstract void GrowArea();
    }
}

(2)定义一个继承抽象类的Apple类,代码如下:

namespace AbstractClassLearn
{
    public class Apple : Fruit
    {
        public override float Price
        {
            get
            {
                if (vendor == "红富士")
                {
                    return 1000;
                }
                else return 0;
            }
        }

        public override void GrowArea()
        {
            Console.WriteLine("水果品种:" + vendor + "  " + "当前价格是:" + Price);
        }
    }
}

(3)再定义一个继承抽象类的Orange类,代码如下:

namespace AbstractClassLearn
{
    public class Orange : Fruit
    {
        public override float Price
        {
            get
            {
                if (vendor == "橘子") return 200;
                else return 0;
            }
        }

        public override void GrowArea()
        {
            Console.WriteLine("水果品种:" + vendor + "  " + "当前价格是:" + Price);
        }
    }
}

(4)在main函数中输入:

namespace AbstractClassLearn
{
    class Program
    {
        static void Main(string[] args)
        {
            Fruit f = new Apple();
            f.vendor = "苹果";
            f.GrowArea();

            f = new Orange();
            f.vendor = "橘子";
            f.GrowArea();

            Console.ReadKey();
        }
    }
}

结果如下图所示:

3、在什么情况下使用抽象类

比如说:我们需要创建 “狗”、“猫”、“马”等这些对象(类),而他们有一些共同的属性(properties)像嘴巴、尾巴、重量、颜色、大小等等,但是它们彼此的属性之间是有差异的(比如嘴巴的大小,尾巴的长短等),在这种情况下,我们如果一个个去定义各自的属性就显得比较繁琐。如果使用抽象类,则实现过程会很方便。

抽象类也有个更好的方面,那就是“同质异像”,其解释为:进行实质相同实现形式不同的方法继承,例如狗、猫、马等的呼吸方法或者奔跑速度形式不同,此时在抽象类中定义抽象方法,让他们各自继承抽象类,在抽象方法中去实现各自的形式。抽象的意义就在于:将共同的东西抽出来封装,但不实现只给继承

4、总结

  1. 抽象类中的抽象属性和抽象方法必须使公有的,用public修饰符

  2. 子类必须重写(override)抽象类中所有抽象属性和抽象方法,如果没有全部重写,那么子类必须使抽象类

  3. 抽象类中可以有非抽象属性和非抽象方法,也可以是私有或者公有,但如果是私有的话,那么子类将无法访问,无意义,所以一般情况下都写为公有

  4. 有抽象方法或者抽象属性的类一定是抽象类,抽象类中的属性或方法不一定都是抽象的

  5. 抽象方法不能有函数体,只能定义,不能包含具体实现,抽象类不能被实例化,只能被继承

猜你喜欢

转载自blog.csdn.net/Kevin_Sun777/article/details/113884255
今日推荐