C# 面向对象补全计划 两步分清抽象类和接口

发布于:2024-10-13 ⋅ 阅读:(10) ⋅ 点赞:(0)

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.");
    }
}