最近在看视频学习 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;
}
}
1
lightjiao 2023-07-01 13:19:56 +08:00 via iPhone
如果只是想要执行一个方法的话,在 ManagerBase 里声明一个静态的 Action ,就叫 HelloAction 吧
初始化 Manager 的时候把方法注册到这个 Action 里 调用的时候就只需要 ManagerBase.HelloAction?.Invoke() |
2
geelaw 2023-07-01 14:11:21 +08:00 via iPhone
不存在 ManagerBase 类,只存在 ManagerBase<T> 泛型类,然后 ManagerBase<A> 和 ManagerBase<B> 是两个没什么关系的类。
你的需求可以用接口解决。 |
3
exqibao OP @geelaw 确实有道理,那个教程视频,一开始 ManagerBase 是没有<T>的,ManagerBase: MySingletonBase<ManagerBase>直接写死的,后来的视频突然有了泛型<T> ,加上泛型后原来的 List 就不好使,也不知道视频里的代码是怎么写的,非常好奇
|
4
forgottencoast 2023-07-07 09:25:33 +08:00
#2 说的对,ManagerBase ,ManagerBase<ClassA>,ManagerBase<ClassB>,ManagerBase<ClassC>...都是不同的类型,虽然看起来好像一样,实际不通用。
泛型类只是共用了同样的处理逻辑(算法)。 |