C# 如何构造抽象类

C# 如何构造抽象类,c#,class,inheritance,unity3d,abstract,C#,Class,Inheritance,Unity3d,Abstract,我正在写一个游戏,想听听大家对我的班级结构的看法 目前我有一个角色类,一个AICharacter类和一个KnightCharacter类 角色包含像Death()这样的东西,所有角色都必须为其提供便利,而AICharacter则为AI驱动的角色提供了额外的细节来覆盖Death()。骑士角色优先于处理盾牌之类的角色(仅适用于骑士) 我如何才能优雅地允许我的玩家拥有一个骑士角色:角色,而我的AI拥有一个骑士角色:艾克角色:角色 我基本上只想在AI控制下实现AICharacter 谢谢一种非常灵活的方

我正在写一个游戏,想听听大家对我的班级结构的看法

目前我有一个角色类,一个AICharacter类和一个KnightCharacter类

角色包含像Death()这样的东西,所有角色都必须为其提供便利,而AICharacter则为AI驱动的角色提供了额外的细节来覆盖Death()。骑士角色优先于处理盾牌之类的角色(仅适用于骑士)

我如何才能优雅地允许我的玩家拥有一个骑士角色:角色,而我的AI拥有一个骑士角色:艾克角色:角色

我基本上只想在AI控制下实现AICharacter


谢谢

一种非常灵活的方法是将角色和对象分解为不同的方面,每个方面都是自己的类。动作或RPG角色可能具有的某些方面的示例包括:健康、法力、穿戴设备、使用地点、移动对象、物理刚体、MeleeAttackPerformer、RangedAttackPerformer、MagicTackPerformer、PlayerControl移动设备、Aicontrolled移动设备,甚至音频源等。。。这些类中的每一个都将派生自一个公共基,例如AspectMixin或类似的东西

如果您将这些类中的每一个都视为混合类,那么在创建新的原型时就获得了很大的灵活性,这些原型具有对该类型的参与者有意义的方面。例如,这将允许怪物和玩家分享这样一个事实,即他们拥有生命,但拥有不同的职业来控制它们(AI控制与玩家控制)。此外,可将健康方面添加到静止物体(例如桶)上,以使其受到损坏的影响

为了实现这一点,您的原型对象存储了该原型的方面混合列表。此外,方面需要能够通过类型(或接口)查询主对象中的其他方面。设置起来有点麻烦,但这是灵活性的代价

FWIW,这是Unity引擎试图鼓励的方法(考虑他们称之为MonoBehavior:behavior..aspect…同一概念的不同词汇),尽管许多开发人员直到他们制作了几个失败的原型,其中类很快变成了整体,才“理解”


回到你最初的问题,这有点取决于你有多少可玩的职业,以及AI是否可以控制相同职业的角色。如果是这样,最好将控件从角色中抽象出来,然后让AIControls和PlayerControl派生自控件,这两个控件都可以与角色类接口


另一方面,如果AI类型可以被分解为几个不同的行为(攻击性怪物、和平NPC),我会将每个行为都作为一个方面。

一种非常灵活的方法是将角色和对象分解为不同的方面,每个方面都是自己的类别。动作或RPG角色可能具有的某些方面的示例包括:健康、法力、穿戴设备、使用地点、移动对象、物理刚体、MeleeAttackPerformer、RangedAttackPerformer、MagicTackPerformer、PlayerControl移动设备、Aicontrolled移动设备,甚至音频源等。。。这些类中的每一个都将派生自一个公共基,例如AspectMixin或类似的东西

如果您将这些类中的每一个都视为混合类,那么在创建新的原型时就获得了很大的灵活性,这些原型具有对该类型的参与者有意义的方面。例如,这将允许怪物和玩家分享这样一个事实,即他们拥有生命,但拥有不同的职业来控制它们(AI控制与玩家控制)。此外,可将健康方面添加到静止物体(例如桶)上,以使其受到损坏的影响

为了实现这一点,您的原型对象存储了该原型的方面混合列表。此外,方面需要能够通过类型(或接口)查询主对象中的其他方面。设置起来有点麻烦,但这是灵活性的代价

FWIW,这是Unity引擎试图鼓励的方法(考虑他们称之为MonoBehavior:behavior..aspect…同一概念的不同词汇),尽管许多开发人员直到他们制作了几个失败的原型,其中类很快变成了整体,才“理解”


回到你最初的问题,这有点取决于你有多少可玩的职业,以及AI是否可以控制相同职业的角色。如果是这样,最好将控件从角色中抽象出来,然后让AIControls和PlayerControl派生自控件,这两个控件都可以与角色类接口


另一方面,如果AI类型可以被分解为几个不同的行为(攻击性怪物、和平NPC),我会将每个行为都变成一个方面。

你所问的是普通c#继承不可能的。你哥哥的祖父和你一样

由于您似乎在寻找想法,这里有一个使用泛型的方法:

abstract class BaseController
{
    virtual GameEvent ReadNextEvent();
}

class PlayerController : BaseController
{
    override GameEvent ReadNextEvent
    {
        return userInterface.ReadNextEvent();
    }
}

class NonPlayerController : BaseController
{
    override GameEvent ReadNextEvent
    {
        artificialIntelligenceEngine.Think();
        return artificialIntelligenceEngine.ReadNextEvent();
    }
}

abstract class Character<T> where T : BaseController
{
    protected T controller;

    abstract ProcessEvents();
}

class KnightCharacter<T> : Character<T>
{
    override ProcessEvents()
    {
        var e = controller.ReadNextEvent();
        switch (e.Action)
        {
            1 : SwingSword(); break;
            2 : LiftShield(); break;
            3 : Yell("None shall pass!"); break;
        }
    }
}



class Program 
{
    void Example()
    {
        var playerKnight = new KnightCharacter<PlayerController>();
        var aiKnight = new KnightCharacter<NonPlayerController>();
    }
}
抽象类BaseController
{
虚拟游戏事件ReadNextEvent();
}
类PlayerController:BaseController
{
覆盖GameEvent ReadNextEvent
{
返回userInterface.ReadNextEvent();
}
}
类非层控制器:BaseController
{
覆盖GameEvent ReadNextEvent
{
人工智能引擎。思考();
返回artificialIntelligenceEngine.ReadNextEvent();
}
}
抽象类字符,其中T:BaseController
{
受保护的T控制器;
抽象过程事件();
}
职业骑士性格:性格
{
重写ProcessEvents()
{
var e=controller.ReadNextEvent();
开关(电动)
{
1:SwingSword();break;
2:提升挡板();断裂;
3:喊叫(“没有人会通过!”);休息;
}
}
}
班级计划
{
无效示例