20.抽象类和抽象方法

20.面向对象-多态-抽象类和抽象方法


20.1 知识点

抽象类

示例代码

abstract class Thing
{
    public string name;

    // 可以在抽象类中写抽象方法
    public abstract void AbstractMethod();
}

class Water : Thing
{
    public override void AbstractMethod()
    {
        // 实现抽象方法的具体逻辑
    }
}

主函数

// 抽象类不能被实例化
// Thing thing = new Thing();

// 但是,可以遵循里氏替换原则,用父类容器装子类
Thing water = new Water();

抽象方法

示例代码

abstract class Fruits
{
    public string name;

    // 抽象方法,没有方法体,不能是私有的,继承后必须实现
    public abstract void AbstractTest();

    // 虚方法,可以选择是否写逻辑
    public virtual void VirtualTest()
    {
        // 可以选择是否写逻辑
    }
}

class Apple : Fruits
{
    // 继承后必须实现,用 override 重写
    public override void AbstractTest()
    {
        // 具体实现抽象方法的逻辑
    }

    // 虚方法是可以由子类选择性实现的
    // 抽象方法必须要实现,虚方法可以选择是否实现
    // 比如 VirtualTest() 可以不被重写,也可以重写
    public override void VirtualTest()
    {
        // 具体实现虚方法的逻辑
    }
}

class SuperApple : Apple
{
    // 虚方法和抽象方法都可以被子类无限地去重写
    public override void AbstractTest()
    {
        base.AbstractTest();
    }

    public override void VirtualTest()
    {
        base.VirtualTest();
    }
}

总结

  • 抽象类:被 abstract 修饰的类,不能被实例化,可以包含抽象方法。
  • 抽象方法:没有方法体的纯虚方法,继承后必须实现。
  • 如何选择普通类还是抽象类?
    • 不希望被实例化的对象,相对比较抽象的类可以使用抽象类。
    • 父类中的行为不太需要被实现,只希望子类去定义具体规则的,可以选择抽象类,然后使用其中的抽象方法来定义规则。
  • 抽象类和抽象方法的作用:在整体框架设计时使用。

20.2 知识点代码

using System;

namespace Lesson18_多态_抽象类和抽象方法
{
    //class语句块外 namespace语句块内

    #region 知识点一 抽象类

    //抽象类的概念:被抽象关键字abstract修饰的类
    //抽象类的特点:
    //1.不能被实例化的类
    //2.可以包含抽象方法
    //3.继承抽象类必须重写其抽象方法

    //实例
    //东西类 是抽象类 不能被new出来
    abstract class Thing
    {
        //抽象类中 封装的所有知识点都可以在其中书写
        public string name;

        //可以在抽象类中写抽象方法
    }
    //水类 继承抽象 东西类 可以new
    class Water:Thing
    {

    }

    #endregion

    #region 知识点二 抽象方法

    //抽象方法 又叫 抽象函数和纯虚方法 是用abstract关键字修饰的方法
    //抽象方法的特点:
    //1.只能在抽象类中申明
    //2.没有方法体
    //3.不能是私有的
    //4.继承后必须实现 用override重写

    //实例
    //水果抽象类
    abstract class Fruits
    {
        public string name;

        //抽象方法 不能是私有的 否则报错
        //private abstract void BeEaten();
        //abstract void BeOpened();

        //抽象方法 是一定不能有函数体的
        public abstract void AbstractTest();

        //虚方法 要有函数体
        public virtual void VirtualTest()
        {
            //可以选择是否写逻辑
        }
    }

    //苹果类 继承水果类
    class Apple : Fruits
    {
        //继承后必须实现 用override重写
        public override void AbstractTest()
        {
            
        }

        //public override void VirtualTest()
        //{
        //    base.VirtualTest();
        //}

        //虚方法是可以由我们子类选择性来实现的
        //比如VirtualTest()可以不被重写 也可以重写
        //抽象方法必须要实现 
        //比如AbstractTest()必须被重写
    }

    //超级苹果类 继承苹果类
    class SuperApple:Apple
    {

        //虚方法和抽象方法 都可以被子类无限的 去重写
        public override void AbstractTest()
        {
            base.AbstractTest();
        }

        public override void VirtualTest()
        {
            base.VirtualTest();
        }
    }

    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("抽象类和抽象方法");

            //主函数内

            #region 知识点一 抽象类

            //抽象不能被实例化
            //Thing thing = new Thing();

            //但是 可以遵循里氏替换原则 用父类容器装子类
            Thing water = new Water();

            #endregion
        }
    }

    //总结

    //抽象类:被abstract修饰的类 不能被实例化 可以包含抽象方法
    //抽象方法:没有方法体的纯虚方法 继承后必须去实现的方法 
    //注意:如何选择普通类还是抽象类?
    //不希望被实例化的对象,相对比较抽象的类可以使用抽象类
    //父类中的行为不太需要被实现的,只希望子类去定义具体的规则的 可以选择 抽象类然后使用其中的抽象方法来定义规则
    //作用:会在整体框架设计时使用
}

20.3 练习题

写一个动物抽象类,写三个子类。实现人叫,狗叫,猫叫

class语句块外 namespace语句块内

// 抽象动物类
abstract class Animal
{
    // 抽象方法 叫
    public abstract void Speak();
}

// 人类
class Person : Animal
{
    public override void Speak()
    {
        Console.WriteLine("你好");
    }
}

// 狗类
class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("汪汪");
    }
}

// 猫类
class Cat : Animal
{
    public override void Speak()
    {
        Console.WriteLine("喵喵");
    }
}

主函数内

// 主函数内
Animal person = new Person();
person.Speak();//你好

Dog dog = new Dog();
dog.Speak();//汪汪

Animal cat = new Cat();
cat.Speak();//喵喵

使用抽象类和抽象方法

class语句块外 namespace语句块内

创建一个图形类,有求面积和周长两个方法
创建矩形类,正方形类,圆形类继承图形类
实例化矩形、正方形、圆形对象求面积和周长

abstract class Graph
{
    public abstract float GetLength();
    public abstract float GetArea();
}

// 矩形类
class Rect : Graph
{
    private float w;
    private float h;

    public Rect(int w, int h)
    {
        this.w = w;
        this.h = h;
    }

    public override float GetLength()
    {
        return 2 * (w + h);
    }

    public override float GetArea()
    {
        return w * h;
    }
}

// 正方形类
class Square : Graph
{
    private float l;

    public Square(int l)
    {
        this.l = l;
    }

    public override float GetLength()
    {
        return 4 * l;
    }

    public override float GetArea()
    {
        return l * l;
    }
}

// 圆形类
class Circular : Graph
{
    private float r;

    public Circular(float r)
    {
        this.r = r;
    }

    public override float GetLength()
    {
        return 2 * 3.14f * r;
    }

    public override float GetArea()
    {
        return 3.14f * r * r;
    }
}

主函数内

// 主函数内
Rect rect = new Rect(2, 3);
Console.WriteLine(rect.GetArea());//6
Console.WriteLine(rect.GetLength());//10

Square square = new Square(4);
Console.WriteLine(square.GetArea());//16
Console.WriteLine(square.GetLength());//16

Circular circular = new Circular(2);
Console.WriteLine(circular.GetArea());//12.56
Console.WriteLine(circular.GetLength());//12.56

20.4 练习题代码

using System;

namespace Lesson18_练习题
{
    //class语句块外 namespace语句块内
    #region 练习题一
    //写一个动物抽象类,写三个子类
    //实现人叫,狗叫,猫叫

    //抽象动物类
    abstract class Animal
    {
        //抽象方法 叫
        public abstract void Speak();
    }
    //人类
    class Person : Animal
    {
        public override void Speak()
        {
            Console.WriteLine("你好");
        }
    }
    //狗类
    class Dog:Animal
    {
        public override void Speak()
        {
            Console.WriteLine("汪汪");
        }
    }
    //猫类
    class Cat:Animal
    {
        public override void Speak()
        {
            Console.WriteLine("喵喵");
        }
    }

    #endregion

    #region 练习题二
    //使用抽象类和抽象方法
    //创建一个图形类,有求面积和周长两个方法
    //创建矩形类,正方形类,圆形类继承图形类
    //实例化矩形、正方形、圆形对象求面积和周长

    abstract class Graph
    {
        public abstract float GetLength();
        public abstract float GetArea();
    }

    //矩形类
    class Rect : Graph
    {
        private float w;
        private float h;

        public Rect(int w, int h)
        {
            this.w = w;
            this.h = h;
        }
        public override float GetLength()
        {
            return 2 * (w + h);
        }

        public override float GetArea()
        {
            return w * h;
        }
    }
    //正方形类
    class Square : Graph
    {
        private float l;

        public Square(int l)
        {
            this.l = l;
        }

        public override float GetLength()
        {
            return 4 * l;
        }

        public override float GetArea()
        {
            return l * l;
        }
    }
    //图形类
    class Circular : Graph
    {
        private float r;

        public Circular(float r)
        {
            this.r = r;
        }

        public override float GetLength()
        {
            return 2 * 3.14f * r;
        }

        public override float GetArea()
        {
            return 3.14f * r * r;
        }
    }
    #endregion
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("抽象类抽象方法练习题");
            //主函数内
            #region 练习题一

            Animal person = new Person();
            person.Speak();//你好

            Dog dog = new Dog();
            dog.Speak();//汪汪

            Animal cat = new Cat();
            cat.Speak();//喵喵

            #endregion
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏