我有一个类/行为
MyBehavior
,它使用以下代码在游戏对象上查找实现接口IMyInterface
的任何组件:myInterface = (IMyInterface)gameObject.GetComponentInParent (typeof(IMyInterface))
。
IMyInterface
由多个类/行为实现。例如:
public class MyClass1: MonoBehaviour, IMyInterface
public class MyClass2: MonoBehaviour, IMyInterface
等等等等
我希望能够确定
MyClass1
、MyClass2
等组件是否启用或禁用。
但是,我不确定如何访问组件,并且接口似乎无法访问
enabled
和 disabled
属性。
我考虑过的一个解决方案是明确检查类型,例如
myInterface is MyClass1
但这有一个问题,如果我创建一个实现该接口的新类,我必须记住回到这个MyBehavior
脚本并更新它,这是我不喜欢的。
有什么方法可以获取接口所在类的类型,并访问其
enabled
或 disabled
属性吗? 如果我总是期望它是一个单一行为,那么将其转换为 Monobehaviour
工作可以吗?或者这是一个隐藏问题的坏主意吗?
如果你被允许改变
IMyInterface
,就这么简单:
public interface IMyInterface {
public bool enabled { get; set; }
}
即使您将接口应用于类层次结构中的派生类型,该接口仍然可以公开属于该类接口的任何成员,无论它们在继承链中的位置有多远。
因此,您可以确保访问
enabled
(实际上是其父级 MonoBehaviour
)类的原始 Behaviour
属性。
如果不允许更改
IMyInterface
,那么可以,转换为 MonoBehaviour
或 Behaviour
,而不是转换为具体类型。
IMyInterface myInterface = ...
MonoBehaviour myBehaviour = (MonoBehaviour)myInterface;
这绝对不是一个坏习惯,因为在这里你已经通过使用
MonoBehaviour
进入了 gameObject.GetComponentInParent
范式。这显然不适用于 C# 类,也不适用于 ScriptableObject
或不在 MonoBehaviour
层次结构中的其他类型。所以你在这里很安全。
比较两种方法:由于您已经使用了接口,因此最好公开那里的属性,而不是强制转换所有内容。