代码之家  ›  专栏  ›  技术社区  ›  anderlaini

C#和Unity-无法理解扩展基类的正确方法

  •  1
  • anderlaini  · 技术社区  · 6 月前

    我有两种NPC(客人和工人),它们会有不同的逻辑和行为。例如:

    • 在GuestController,我想管理客人加入的地方。

    • 在WorkerController,我想管理Worker正在做的当前工作。

    所以我创建了这些基类进行扩展。

    NPC.NPCController{} // navmesh, animator, statemanager...
    NPC.INPCState{} // State's methods like Enter, Execute, Exit
    NPC.StateManager{} // switch current State
    

    然后我创建NPCGuest类:

    NPCGuest.NPCGuestController : NPCController{}
    NPCGuest.StateFreeWalk : NPC.INPCState{}
    

    然后创建了NPCWorker类:

    NPCWorker.NPCWorkerController : NPCController{}
    NPCWorker.StateFreeWalk : NPC.INPCState{}
    

    我遇到的问题是创建和使用每个控制器的特定逻辑。

    例如,GuestController中的具体方法:

    using Myproject.NPC;
    namespace Myproject.NPCGuest
    {
        public class NPCGuestController : NPC.NPCController
        {
            public void guestSpecificMethod()
            {
                Debug.Log("specific method for Guest");
            }
        }
    }
    

    然后尝试使用Guest State类中的此方法:

    using Myproject.NPC;
    namespace Myproject.NPCGuest
    {
        public class StateFreeWalk : NPC.INPCState
        {
            public void Enter(NPCController npc)
            {
                npc.guestSpecificMethod();
            }
        }
    }
    

    这会导致错误,因为Enter方法需要 NPController 相反 NPCGuestController .

    如果我将其更改为预期 NPC用户控制器 ,它会导致行错误 public class StateFreeWalk : NPC.INPCState ,因为 INPCState 也期待着基类 NPCController .

    我做错了什么?

    是否有可能重用基类?或者,我应该为Guest和Worker创建单独的INPCState和StateManager类吗?

    2 回复  |  直到 6 月前
        1
  •  2
  •   Artem Cherevan    6 月前

    我在这里看到的一个选择是使用泛型,这可能是一个很好的例子,但这取决于你对未来功能和总体架构的看法。
    你可以制作你的界面 NPC.INPCState 一般来说,像这样:

    public interface INPCState<T> where T : NPCController
    

    通过这种方式,您可以明确特定州所需的确切类型:

    public class StateFreeWalk : INPCState<NPCGuestController>   
    {         
        public void Enter(NPCGuestController npc)         
        {             
            npc.guestSpecificMethod();         
        }     
    }
    
        2
  •  1
  •   null    6 月前

    不要注射 NPCGuestController 通过参数 Enter() 方法,但通过例如构造函数 StateFreeWalk .

    这将断开接口 NPC.INPCState 根据实现的特定需求(依赖关系) 州自由行 .

    using Myproject.NPC;
    namespace Myproject.NPCGuest
    {
        private readonly NPCGuestController _controller;
    
        public class StateFreeWalk : NPC.INPCState
        {
            public StateFreeWalk(NPCGuestController npc)
            {
                _controller = npc;
            }
        
            public void Enter()
            {
                _controller.guestSpecificMethod();
            }
        }
    }