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