我正在使用一个无法更改的现有类库(Godot,如果重要的话),并且拥有我自己的从该库中的类扩展的类。
我的类不会全部扩展库中的同一个类,但它们在该库中将有一个共同的祖先类。
我想编写一些实用方法来接受我的一些类并调用公共基类上的方法。
为我的类上的通用方法添加接口很容易,但我不能也“要求”该类型具有共同的祖先。
例如,我可能有以下层次结构:
Node (API class)
|
+-Node2D (API class)
|
+-RigidBody2D (API class)
| |
| +-MyClassA : ICommon (My custom class and interface)
|
+-Area2D (API class)
|
+-MyClassB : ICommon (My custom class and interface)
然后我想要一个需要
ICommon
但也要求它扩展 Node2D
的方法
目前我能想到的唯一方法是使用泛型,例如:
void T MyMethod<T>(T arg) where T : Node2D, ICommon
但这感觉非常麻烦,并且如果需要返回不同的类型则不起作用(仍然有
Node2D
和 ICommon
的限制。
如果我想使用混合的类数组,它也不起作用,例如:
void T[] OtherMethod<T>(T[] arg) where T : Node2D, ICommon
将要求数组属于同一类 - 我不能拥有混合了
MyClassA
和 MyClassB
的数组。
有没有更好的方法来处理这个问题?
使用通用基类
public abstract class Node2DCommon<T> : Node2D, ICommon where T : Node2D, ICommon
{
// Your implementation
}
您可以使用一组
Node2D
并确保它们实现 ICommon
接口。
public void ProcessNodes(Node2D[] nodes)
{
foreach (var node in nodes)
{
if (node is ICommon commonNode)
{
// Call your common methods here
commonNode.CommonMethod();
}
}
}