C# 如何允许一个类接受另一个类的所有派生类?

C# 如何允许一个类接受另一个类的所有派生类?,c#,class,unity3d,inheritance,state,C#,Class,Unity3d,Inheritance,State,我正在制作一个敌方脚本,它使用基于类的状态机,我已经制作了一个状态类,所有不同的状态都是从该类派生的,并且这些类中的每一个都需要一个EnemyController类作为其变量和方法。我还制作了3个不同的敌人类,它们来自EnemyController类,但不能输入到状态。我想找到一种方法,以便将这三个敌方脚本输入到状态,但它们似乎只接受父级EnemyController脚本 public State(EnemyController enemy) { this.enemy = enemy;

我正在制作一个敌方脚本,它使用基于类的状态机,我已经制作了一个状态类,所有不同的状态都是从该类派生的,并且这些类中的每一个都需要一个EnemyController类作为其变量和方法。我还制作了3个不同的敌人类,它们来自EnemyController类,但不能输入到状态。我想找到一种方法,以便将这三个敌方脚本输入到状态,但它们似乎只接受父级EnemyController脚本

public State(EnemyController enemy)
{
    this.enemy = enemy;
}

每个州都需要一个EnemyController参数,但我希望它能够使用EnemyControllerA、EnemyControllerB或EnemyControllerC,因为每个敌方的控制器对于每个敌方都略有不同。

我不确定您是否是所指的对象,因为问题不太清楚。 如果不是这样的话,我建议你分享一个更完整的尝试,来缩小你的问题范围

我觉得您可能想要的是,接口实现的类型可以是子接口的holder类型。这适用于从接口实现的类,或从其他类继承的类。在下面的控制台应用程序代码示例中可以找到我所指的接口实现和类继承

接口:

namespace ConsoleApp
{
    public interface IMethodsToImplement
    {
        void method1();
        void method2();
    }

    public class InterfaceImplementer : IMethodsToImplement
    {
        public InterfaceImplementer() {

        }

        public void method1()
        {
            // whatever
        }

        public void method2()
        {
            // whatever
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<IMethodsToImplement> holderList = new List<IMethodsToImplement>() {
                new InterfaceImplementer(), new InterfaceImplementer() 
            };

            Console.WriteLine($"InterfaceImplementer count: {holderList.Count}");
            Console.ReadLine();
        }
    }
}
名称空间控制台
{
公共接口i方法实现
{
void方法1();
void方法2();
}
公共类接口实现程序:IMethodsToImplement
{
公共接口执行器(){
}
公共无效方法1()
{
//随便
}
公开作废方法2()
{
//随便
}
}
班级计划
{
静态void Main(字符串[]参数)
{
列表持有者列表=新列表(){
new InterfaceImplementer(),new InterfaceImplementer()
};
WriteLine($“InterfaceImplementer计数:{holderList.count}”);
Console.ReadLine();
}
}
}
从另一个类继承:

using System.Collections.Generic;

namespace ConsoleApp
{
    public class A { 
    
    }

    public class B : A
    {
        public B() {

        }

        public void method1()
        {
            // whatever
        }

        public void method2()
        {
            // whatever
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<A> holderList = new List<A>() {
                new B(), new B() 
            };

            Console.WriteLine($"InterfaceImplementer count: {holderList.Count}");
            Console.ReadLine();
        }
    }
}
使用System.Collections.Generic;
名称空间控制台
{
公共A类{
}
B级:A级
{
公共图书馆B(){
}
公共无效方法1()
{
//随便
}
公开作废方法2()
{
//随便
}
}
班级计划
{
静态void Main(字符串[]参数)
{
列表持有者列表=新列表(){
新的B(),新的B()
};
WriteLine($“InterfaceImplementer计数:{holderList.count}”);
Console.ReadLine();
}
}
}
在这两种情况下,获得的输出都是
接口执行器计数:2

请注意,基类型或实现接口如何作为继承或实现链中任何子级的标识类型。

向我们展示一些代码:)“这些不能输入到状态”-为什么不?你有什么错误?您应该能够传入
EnemyController
的任何派生类。