C#/Unity------抽象类与接口(一篇文章彻底搞懂...)

抽象类/接口以及区别

SUMMARY:

具体类→抽象类→接口:越来越抽象,内部实现的东西越来越少

一、抽象类

抽象类是未完全实现逻辑的类

抽象类为复用而生,专门用作基类

封装确定的,开放不确定的,推迟到合适的子类来实现

抽象类的成员可以是私有的,受保护的,内部的

using UnityEngine;
using System;

public class OCPandObstract : MonoBehaviour
{
    private void Start()
    {
        Vehicle1 vehicle1 = new();
        vehicle1.Run();

        //无法实例化抽象类,只能实现其子类
        Vehicle2 v = new Car2();
        v.Stop();
    }
}
/// <summary>
/// 一个汽车类,一个卡车类,里面的方法都是一样的,重新写两个类就很繁琐
/// </summary>
class Car
{
    public void Run()
    {
        Console.WriteLine("Car is running ..");
    }
    public void Stop()
    {
        Console.WriteLine("Stopped...");
    }
}
class Truck
{
    public void Run()
    {
        Console.WriteLine("Car is running ..");
    }
    public void Stop()
    {
        Console.WriteLine("Stopped...");
    }
}

/// <summary>
/// 简化方法1:使用虚函数进行重写,符合开闭原则
/// </summary>
class Vehicle1
{
    public void Stop()
    {
        Console.WriteLine("Stopped...");
    }
    public virtual void Run()
    {
        Console.WriteLine("Vehicle is running...");
    }
}
class Car1:Vehicle1
{
    public override void Run()
    {
        Console.WriteLine("Car1 is running...");
    }
}
class Truck1:Vehicle1
{
    public override void Run()
    {
        Console.WriteLine("Truck1 is running...");
    }
}

/// <summary>
/// 简化方法2:,使用抽象类,抽象函数,也就是纯虚方法
/// 此时抽象类无法实例化
/// </summary>
abstract class Vehicle2
{
    public  void Stop()
    {
        Console.WriteLine("Stopped...");
    }
    /// <summary>
    /// Run需要重写,因此作为抽象函数,没有实现部分
    /// </summary>
    public abstract void Run();
}
class Car2 : Vehicle2
{
    public override void Run()
    {
        Console.WriteLine("Car2 is running...");
    }
}
class Truck2 : Vehicle2
{
    public override void Run()
    {
        Console.WriteLine("Truck2 is running...");
    }
}

上述代码一步步介绍了为什么使用抽象类,怎么使用抽象函数

抽象方法又称为纯虚方法

二、接口

接口是完全未实现逻辑的“类”

接口是“纯虚类”,只有成员函数,成员全部public

接口为解耦而生,高内聚,低耦合

继承自接口的类必须实现接口中的函数,且自身无法实现

接口中可以有属性,方法,事件,索引

接口成员默认是公开的,且不加任何修饰符

using UnityEngine;

public class OCPandInterface : MonoBehaviour
{
    
}
/// <summary>
/// 纯抽象类
/// </summary>
abstract class AnimalBase
{
    abstract public void Eat();
    abstract public void Sleep();
    abstract public void Walk();
}
/// <summary>
/// 抽象类,继承自纯抽象类
/// </summary>
abstract class Animal : AnimalBase
{
    public override void Eat()
    {

    }
    public override void Sleep()
    {

    }
}
/// <summary>
/// 具体类
/// </summary>
class Dog:Animal
{
    public override void Walk()
    {

    }
}
/// <summary>
/// 具体类
/// </summary>
class Duke : Animal
{
    public override void Walk()
    {

    }
}

/// <summary>
/// 引入interface,它成员变量默认为抽象且公开
/// </summary>
interface IAnimalBase
{
    void Eat();
    void Sleep();
    void Walk();
}
abstract class Animal1 : IAnimalBase
{
    /// <summary>
    /// 继承接口以后,也变成了具体方法
    /// </summary>
    public void Eat()
    {
        
    }

    public void Sleep()
    {

    }

    public abstract void Walk();
}
class Dog1 : Animal1
{
    public override void Walk()
    {

    }
}
class Duke1 : Animal1
{
    public override void Walk()
    {

    }
}

上述代码描述了如何引入的接口,且接口如何定义

猜你喜欢

转载自blog.csdn.net/leikang111/article/details/129328838