【C#基础】chatGpt带你学C#接口,它在游戏中有什么应用?

这篇具有很好参考价值的文章主要介绍了【C#基础】chatGpt带你学C#接口,它在游戏中有什么应用?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

What are Interfaces?

In computer programming, an interface is a set of rules or guidelines that define how different software components or systems should interact with each other. It serves as a contract between two or more components, specifying how they should communicate with each other without revealing the underlying implementation details.

An interface defines a standardized set of methods, properties, events, and other members that can be used by other software components or systems. By adhering to a common interface, components can communicate with each other consistently and predictably, even if they were developed by different software vendors or on different platforms.

Interfaces can be used in a variety of programming languages and technologies, including object-oriented programming, web services, and message-based systems. They are particularly useful in large, complex software systems where many different components need to work together seamlessly.

经过Grammarly的修改后再由chatGpt翻译如下:

在计算机编程中,接口是一组规则或指导方针,用于定义不同的软件组件或系统应如何相互交互。它充当两个或多个组件之间的契约,规定它们应该如何相互通信,同时不揭示底层实现细节。

接口定义了一组标准化的方法、属性、事件和其他成员,可供其他软件组件或系统使用。通过遵守共同的接口,组件可以以一种一致和可预测的方式相互通信,即使它们由不同的软件供应商或在不同的平台上开发。

接口可用于各种编程语言和技术,包括面向对象编程、Web服务和基于消息的系统。它们特别适用于大型复杂的软件系统,在这些系统中,许多不同的组件需要无缝地协同工作。

Defining Interface

在C#中,可以通过以下方式定义接口:

public interface IMyInterface
{
    // 定义方法签名,但不提供实现
    void MyMethod1();
    
    // 定义带参数的方法签名
    int MyMethod2(string input);
    
    // 定义属性,不包含实现
    string MyProperty { get; set; }
    
    // 定义事件,不包含实现
    event EventHandler MyEvent;
}

接口是一个纯抽象的概念,它定义了一组方法、属性或事件的签名,但不提供具体的实现。接口是一种规范,它定义了一个类或结构体应该实现的行为。类或结构体可以实现一个或多个接口,并提供相应的实现。在实现接口时,必须提供与接口定义相同的方法、属性或事件的实现。

Interface Implementation

接下来我们会一个一个实现上述定义。

方式一:单个 Interface
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Testing;

public class Testing : MonoBehaviour
{
    private void Start()
    {
        MyClass myClass=new MyClass();
        TestInterface(myClass);
    }

    private void TestInterface(IMyInterface myInterface)
    {
        myInterface.TestFunction();
    }
}

public interface IMyInterface{void TestFunction();}

public class MyClass : IMyInterface
{
    public void TestFunction()
    {
        Debug.Log("MyClass.TestFunction()");
    }
}

【C#基础】chatGpt带你学C#接口,它在游戏中有什么应用?

方式二:Multiple Interface
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Testing;

public class Testing : MonoBehaviour
{
    private void Start()
    {
        MyClass myClass=new MyClass();
        TestInterface(myClass);
        
        MySecondClass mySecondClass=new MySecondClass();
        TestInterface(mySecondClass);
    }

    private void TestInterface(IMyInterface myInterface)
    {
        myInterface.TestFunction();
    }
}

public interface IMyInterface{void TestFunction();}

public class MyClass : IMyInterface
{
    public void TestFunction()
    {
        Debug.Log("MyClass.TestFunction()");
    }
}

public class MySecondClass : IMyInterface
{
    public void TestFunction()
    {
        Debug.Log("MySecondClass.TestFunction()");
    }
}

【C#基础】chatGpt带你学C#接口,它在游戏中有什么应用?

多个接口实现
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Testing;

public class Testing : MonoBehaviour
{
    private void Start()
    {
        MyClass myClass=new MyClass();
        TestInterface(myClass);
    }

    private void TestInterface(IMyInterface myInterface)
    {
        myInterface.TestFunction();
    }
}

public interface IMyInterface: IMySecondInterface
{ 
    void TestFunction();
}

public interface IMySecondInterface
{
    void SecondTestFunction(int i);
}

public class MyClass : IMyInterface, IMySecondInterface
{
    public void SecondTestFunction(int i)
    {

    }

    public void TestFunction()
    {
        Debug.Log("MyClass.TestFunction()");
    }
}
//下面会提示报错,因为public interface IMyInterface: IMySecondInterface没有实现相应的方法
//public class MySecondClass : IMyInterface{...}
Interface Properties

C#中,可以使用接口来定义接口属性。定义接口属性的语法类似于定义常规属性,但需要在属性声明前加上getset访问器,以指定属性的访问方式。下面是一个使用接口属性的示例:

interface IMyInterface
{
    int MyProperty { get; set; }
}

class MyClass : IMyInterface
{
    private int myPropertyValue;

    public int MyProperty
    {
        get
        {
            return myPropertyValue;
        }
        set
        {
            myPropertyValue = value;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass();
        //setter
        myClass.MyProperty = 42;
        //getter
        Console.WriteLine(myClass.MyProperty);
    }
}

在上面的代码中,IMyInterface接口定义了一个名为MyProperty的接口属性,它具有getset访问器。然后,MyClass类实现了IMyInterface接口,并提供了自己的实现来满足接口属性的要求。

MyClass类中,MyProperty属性具有一个私有字段myPropertyValue作为其实际实现,get访问器返回该字段的值,而set访问器设置该字段的值。

最后,在Main方法中,我们创建了一个MyClass对象,并将其MyProperty属性设置为42。然后,我们输出了该属性的值,这将打印出42

定义事件

在 C# 接口中定义事件的语法如下:

event EventHandler MyEvent;

其中,MyEvent 是事件的名称,EventHandler 是事件委托类型。可以根据需要使用自定义的委托类型。

在实现类中实现事件时,需要使用 addremove 关键字分别添加和移除事件处理程序。如下是实例:

public event EventHandler MyEvent
{
    add
    {
        // 在事件委托实例中添加事件处理程序
        // 这里可以添加一些逻辑,例如检查订阅者是否已经存在等等
        _myEvent += value;
    }
    remove
    {
        // 从事件委托实例中移除事件处理程序
        // 这里可以添加一些逻辑,例如检查订阅者是否存在等等
        _myEvent -= value;
    }
}
//实现事件时,通常建议使用私有事件字段来存储事件委托实例,以保证事件的封装性和安全性。
private event EventHandler _myEvent;

public void RaiseEvent()
{
    // 触发事件, 使用可空运算符 ?. 来避免空引用异常,因为可能没有任何订阅者订阅该事件。
    _myEvent?.Invoke(this, EventArgs.Empty);
}

注意:实现类必须显式实现接口中定义的事件,即使它们没有任何实现。这是因为接口事件只是一种合同,要求实现类提供事件的实现。

应用场景

以下代码忽略不需要注意的细节。

问题

假设我们创建一个(或多个)个敌人和一个(或多个)可受打击伤害的物体,在Unity中,默认创建的前者两个对象都有自己独立的C#脚本,不共享任何基类或者任何东西,再创建一个角色player,现在我们希望这名角色可以对敌人和物体造成伤害,我们会怎么做?

先写个一般人会想到的解决思路,我们创建一个飞刀类FlyCutter表示产生伤害的主体,先获取主体,每个主体中有对应的伤害函数,然后判断。

public class FlyCutter : MonoBehaviour{
    //通过物理,检查碰撞
    private void OnTriggerEnter2D(Collider2D collider){
        Enemy enemy = collider.GetComponent<Enemy>();
        if(enemy!=null){
            //造成伤害
            enemy.Damge();
        }
        
        WUPING wuping = collider.GetComponent<WUPING>();
        if(wuping!=null){
            //造成伤害
            wuping.Damge();
        } 
    }
}

创建表示可以有效被造成伤害的敌人Enemy脚本

public class Enemy : MonoBehaviour{
   	/*Enemy的主体信息*/
    
    //假设已经有伤害函数,扣血条
    public void Damage(){...}
}

还要可以被伤害的物体

public class WUPING : MonoBehaviour{
    /*WUPING的主体信息与其他额外的操作,比如打开,盗窃,陷阱等等*/
    
    public void Damage(){...}
}
以为就上面这种一个一个加,就可以了?但是但是,你还是想得太简单了!!!

如果这样干,我们岂不是要考虑所有可能被伤害的主体,换个武器会怎么样?不就重复了吗?

解决思路

  • 当问到有独立这个词时->接口
  • 角色如何对其他主体产生伤害?

于是我们可以在单独的脚本创建一个统一的伤害接口IDamageable

public interface IDamageable{
	void Damage();
}

让敌人和物体实现这个接口

public class Enemy : MonoBehaviour,IDamageable{
    public void Damage(){...}
}

public class WUPING : MonoBehaviour,IDamageable{
    public void Damage(){...}
}

现在可以让我们的飞刀变得简洁了。

public class FlyCutter : MonoBehaviour{
    //通过物理,检查碰撞
    private void OnTriggerEnter2D(Collider2D collider){
        IDamageable damageable = collider.GetComponent<IDamageable>();
        if(damageable!=null){
            //造成伤害
            damageable.Damge();
        }
    }
}

其他应用场景

当使用C#编写游戏时,接口(interface)是一种非常有用的工具,可以帮助您管理和组织代码。下面是一些游戏场景,您可以在这些场景中使用接口:

  1. 角色控制器:如果您正在编写角色控制器,可以使用接口来定义通用的方法,例如移动、攻击、受伤和死亡。每个角色都可以实现这些接口,并覆盖方法来实现特定的行为。
  2. 物品系统:如果您正在编写一个物品系统,可以使用接口来定义通用的物品接口,例如使用、丢弃和交换。这样,每个物品都可以实现这些接口,并覆盖方法来实现特定的行为。
  3. 任务系统:如果您正在编写任务系统,可以使用接口来定义通用的任务接口,例如接受、完成和失败。每个任务都可以实现这些接口,并覆盖方法来实现特定的行为。
  4. 状态机:如果您正在编写状态机,可以使用接口来定义通用的状态接口,例如进入、退出和更新。每个状态都可以实现这些接口,并覆盖方法来实现特定的行为。
  5. 网络通信:如果您的游戏需要与其他玩家或服务器通信,可以使用接口来定义通用的网络接口,例如连接、发送和接收数据。每个网络模块都可以实现这些接口,并覆盖方法来实现特定的行为。

总之,接口可以在游戏中的许多场景中发挥作用,可以帮助您更好地组织和管理代码,从而使您的游戏更易于维护和扩展。文章来源地址https://www.toymoban.com/news/detail-420733.html

到了这里,关于【C#基础】chatGpt带你学C#接口,它在游戏中有什么应用?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【小吉带你学Git】Git分支

    🎊专栏【Git】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题🥰 Git分支是版本控制系统Git中的一个重要概念,它允许开发人员在代码库中独立开发和管理不同的代码线。每个分支都包含项目的完整历史记录

    2024年02月15日
    浏览(40)
  • 一文带你学透MySQL核心——DQL语言

      本期的主要内容是关于SQL语句中的 核心语句 ,我们在生活中使用最多的查询语句DQL语句。 前言 DQL 数据库查询语言  1.介绍 2. 基本查询 2.1 查询多个字段 2.2 查询所有字段 2.3 设置别名 2.4 去除重复记录   2.5 基本查询练习案例  3. 条件查询 where 3.1 语句格式 3.2 条件运算符

    2024年02月08日
    浏览(44)
  • 带你学透SQL语言的核心——DML操作

    DML(Data Manipulation Language)是SQL语言的核心部分,其主要用于对数据库的数据进行增删改查。在学习数据时,学习DML操作是必不可少的一部分。 我们已经基本学会了写SQL来操作数据库,但在命令行中写SQL时,往往有体验感差,效率低等问题,今天开始我们就学习一下 在MySQL的

    2024年02月08日
    浏览(44)
  • 【数据结构与算法】一文带你学透——算法

       本期我们所要学习的内容是数据结构与算法中的算法的相关内容,通过上期我们学的数据结构想必大家都会了吧,在学习完毕之后算法,我想你已经可以编写出比较优秀的代码了, 著名计算机科学家沃思曾提出一个公式 程序=数据结构+算法。双剑合璧,天下无敌!   前言

    2024年02月07日
    浏览(39)
  • 【手把手带你学JavaSE】String类(下篇)

    上篇我们已经学习了String类的一些知识,接下来我们接着学习! 字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法。 static String valueof() 数值转字符串 Integer.parseInt() 字符串整形 Double.parseDouble() 字符串转浮点型 String toUpperCase() 转大写 String toLowerCase() 转小

    2024年02月01日
    浏览(138)
  • 【手把手带你学JavaSE】第六篇:类和对象

    对了!给大家推荐一个刷题学习、面试神器——牛客网 里面有非常多的题库,跟面试经验~非常的良心!! 什么是类? 什么是对象? 怎么去理解这两个抽象的概念呢? Java是一门纯面向对象的语言(Object Oriented Program,继承OOP),在面向对象的世界里,一切皆为对象。 面向对象

    2023年04月20日
    浏览(57)
  • 【胡学长 带你学 Global Mapper 】新手必看 入门指南

    Hi,我是胡学长!感谢您下载Global Mapper______一款经济实惠且易于使用的GIS应用程序。易于使用 直观的界面,高性价比且功能完善的GIS,可提供多源空间数据格式支持,以满足有经验的GIS专业工作者和初级用户的需求。当您开始探索Global Mapper 的丰富特性和功能时,您将很快了

    2024年01月16日
    浏览(56)
  • [元带你学: eMMC协议详解 14] 数据擦除(Erase) 详解

    依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。 所在专栏 《元带你学:eMMC协议》 内容摘要 全文 4200字, 主要内容介绍了各种擦除操作概念以记用法,总结了不同擦除操作的区别, 根据不同安全级别和应用场景, 可以使用最合适的擦除类型。 前言 1 Erase 2 Trim 3 Sanit

    2024年02月09日
    浏览(48)
  • MySQL(七):一文带你学透 mysql运算符 (超详解)

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包