具有基类限制的 C# 接口

问题描述 投票:0回答:1

我正在使用一个无法更改的现有类库(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
的数组。

有没有更好的方法来处理这个问题?

c# godot
1个回答
0
投票

使用通用基类

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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.