泛型存 List 的一个问题

312 天前
 exqibao

最近在看视频学习 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;
    }
}
1312 次点击
所在节点    C#
4 条回复
lightjiao
312 天前
如果只是想要执行一个方法的话,在 ManagerBase 里声明一个静态的 Action ,就叫 HelloAction 吧
初始化 Manager 的时候把方法注册到这个 Action 里
调用的时候就只需要 ManagerBase.HelloAction?.Invoke()
geelaw
312 天前
不存在 ManagerBase 类,只存在 ManagerBase<T> 泛型类,然后 ManagerBase<A> 和 ManagerBase<B> 是两个没什么关系的类。

你的需求可以用接口解决。
exqibao
312 天前
@geelaw 确实有道理,那个教程视频,一开始 ManagerBase 是没有<T>的,ManagerBase: MySingletonBase<ManagerBase>直接写死的,后来的视频突然有了泛型<T> ,加上泛型后原来的 List 就不好使,也不知道视频里的代码是怎么写的,非常好奇
forgottencoast
307 天前
#2 说的对,ManagerBase ,ManagerBase<ClassA>,ManagerBase<ClassB>,ManagerBase<ClassC>...都是不同的类型,虽然看起来好像一样,实际不通用。
泛型类只是共用了同样的处理逻辑(算法)。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/953228

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX