C# & Unity 面向对象补全计划 之 接口_unity c# 接口-CSDN博客
这一篇文章泛泛概述了抽象类与接口,但是他俩都是用作强制继承的,却没有进行系统性地整理实在不合适
今天我就一步到位,两步分清他俩该在什么场景调用
一看构造函数 知特征
记住,结构体和类的本质特征是拥有构造函数
抽象类有构造函数
字段:也是因为这个,所以抽象类可以有字段
属性:至于属性,这是.net引入的语法糖所以在类和接口中拥有
方法:抽象方法没有方法体,必须写在抽象类中且强制重写
当然抽象类可以包含非抽象方法
// 定义一个抽象类
public abstract class Animal
{
public abstract string Name { get; set; }
public abstract string Kind { get; set; }
public abstract string Habit { get; set; }
public abstract void DescribeSelf();
}
// 继承抽象类并实现抽象方法
public class Cat : Animal
{
public override string Name { get; set; } = "猫";
public override string Kind { get; set; } = "猫科类";
public override string Habit { get; set; } = "逮老鼠";
public override void DescribeSelf()
{
Console.WriteLine($"当前动物\n名称:{Name}\n种类:{Kind}\n习性:{Habit}");
}
}
接口没有构造函数
字段:没有构造函数,所以他就不是类,所以其不能包含字段
属性:同上,语法糖通用
方法:开始是没有方法体的,但是c# 8.0以后就可以有了,叫做默认接口方法,用不用看自己的需求
// 定义一个接口
public interface IShopping
{
string ShoppingName { get; set; }
void ShoppingCount();
}
// 实现接口
public class Shopper : IShopping
{
public string ShoppingName { get; set; } = "衣服";
public void ShoppingCount()
{
Console.WriteLine($"我购买了100件: {ShoppingName}");
}
}
二看继承数 识用途
抽象类是类,所以只能被单继承(c#)
正是因为单继承,所以,抽象类天生适合定义所有具有基础属性的祖宗,且因为继承的传递性,可以传递下去
// 定义动物抽象类
public abstract class Animal
{
public abstract void MakeSound();
}
// 定义猴类,继承动物抽象类并实现抽象方法
public class Monkey : Animal
{
public override void MakeSound()
{
Console.WriteLine("Monkey makes sound.");
}
public void Climb()
{
Console.WriteLine("Monkey can climb.");
}
}
// 定义人类,继承猴类
public class Human : Monkey
{
public void Speak()
{
Console.WriteLine("Human can speak.");
}
}
类可以继承多个接口
正是因为多继承,所以,接口天生适合定义数量很多的行为
public interface IFlyable
{
void Fly();
}
public interface ISwimmable
{
void Swim();
}
public interface IAquaticBird : IFlyable, ISwimmable
{
void DisplayAbilities();
}
public class Duck : IAquaticBird
{
public void Fly()
{
Console.WriteLine("Duck is flying.");
}
public void Swim()
{
Console.WriteLine("Duck is swimming.");
}
public void DisplayAbilities()
{
Console.WriteLine("Duck can both fly and swim.");
}
}
最后,抽象类可以继承接口
// 定义一个接口
public interface IAnimal
{
void MakeSound();
}
// 定义一个抽象类,实现接口
public abstract class Mammal : IAnimal
{
public abstract void MakeSound(); // 抽象类没有实现接口方法
public void Breathe()
{
Console.WriteLine("Mammal is breathing.");
}
}
// 定义一个具体类,继承抽象类
public class Human : Mammal
{
public override void MakeSound()
{
Console.WriteLine("Human says hello.");
}
}