V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
exqibao
V2EX  ›  C#

泛型存 List 的一个问题

  •  
  •   exqibao · 2023-07-01 12:44:00 +08:00 · 1509 次点击
    这是一个创建于 540 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看视频学习 untiy 没有源码,跟着视频做遇到一个问题。

    就是实现继承单例“MySingletonBase”,管理基类“ManagerBase”继承“MySingletonBase”实现单例,“UIManager”又继承“ManagerBase”,现在的问题就是假如有好多个“ManagerBase”的实现类怎么存到一个“List<ManagerBase<MonoBehaviour>> Managers = new List<ManagerBase<MonoBehaviour>>()”里面,主要就是那个泛型“T”不知道怎么处理,一直提示类型不对。

    看视频就看到“UIManager : ManagerBase<UIManager>”是这么写,至于 List 怎么改都存不进去,存进去后主要就是遍历执行 ManagerBase 的方法,泛型 T 对于“ManagerBase”也没有什么用,只为了传给“MySingletonBase”。

    怎么才能正常存 List 并遍历执行 ManagerBase 的方法?

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MySingletonBase <T> : MonoBehaviour where T : MonoBehaviour
    {
    
        private static T instance;
    
        public static T Instance
        {
            get
            {
                return instance;
            }
        }
    
        void Awake() {
            instance = this as T;
        }
    }
    
    
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using Net;
    using UnityEngine;
    
    public abstract class ManagerBase<T> : MySingletonBase<T> where T : MonoBehaviour
    {
        public List<MonoBase> Monos = new List<MonoBase>();
    
        public void Register(MonoBase monoBase)
        {
            if (!Monos.Contains(monoBase))
            {
                Monos.Add(monoBase);
            }
        }
        
        ....
    }
    
    
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using Net;
    using UnityEngine;
    
    public class UIManager : ManagerBase<UIManager>
    {
        protected override byte GetMessageType()
        {
            return MessageType.Type_Acount;
        }
    }
    
    4 条回复    2023-07-07 09:25:33 +08:00
    lightjiao
        1
    lightjiao  
       2023-07-01 13:19:56 +08:00 via iPhone
    如果只是想要执行一个方法的话,在 ManagerBase 里声明一个静态的 Action ,就叫 HelloAction 吧
    初始化 Manager 的时候把方法注册到这个 Action 里
    调用的时候就只需要 ManagerBase.HelloAction?.Invoke()
    geelaw
        2
    geelaw  
       2023-07-01 14:11:21 +08:00 via iPhone
    不存在 ManagerBase 类,只存在 ManagerBase<T> 泛型类,然后 ManagerBase<A> 和 ManagerBase<B> 是两个没什么关系的类。

    你的需求可以用接口解决。
    exqibao
        3
    exqibao  
    OP
       2023-07-01 14:21:47 +08:00
    @geelaw 确实有道理,那个教程视频,一开始 ManagerBase 是没有<T>的,ManagerBase: MySingletonBase<ManagerBase>直接写死的,后来的视频突然有了泛型<T> ,加上泛型后原来的 List 就不好使,也不知道视频里的代码是怎么写的,非常好奇
    forgottencoast
        4
    forgottencoast  
       2023-07-07 09:25:33 +08:00
    #2 说的对,ManagerBase ,ManagerBase<ClassA>,ManagerBase<ClassB>,ManagerBase<ClassC>...都是不同的类型,虽然看起来好像一样,实际不通用。
    泛型类只是共用了同样的处理逻辑(算法)。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   998 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:31 · PVG 02:31 · LAX 10:31 · JFK 13:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.