当前位置: 首页 > 知识库问答 >
问题:

工厂类返回通用接口

穆子琪
2023-03-14

我有几个具体的使用以下类型的接口

interface IActivity<T>
{
    bool Process(T inputInfo);
}

具体的课程如下

class ReportActivityManager :IActivity<DataTable>
{
    public bool Process(DataTable inputInfo)
    {
        // Some coding here
    }
}

class AnalyzerActivityManager :IActivity<string[]>
{
    public bool Process(string[] inputInfo)
    {
        // Some coding here
    }
}

现在我怎么能写工厂类,它重新运行一个通用接口,比如IActive。

class Factory
{
    public IActivity<T> Get(string module)
    {
        // ... How can i code here
    }
}

谢谢

共有2个答案

冯和硕
2023-03-14

通常情况下,这是按照拉兹别列佐夫斯基的回答来实现的。在c语言中,当您试图创建工厂无法处理的类型时,可以使用模板专门化来获取编译器错误。

你不能在C#中这样做,但你可以接近。虽然代码可能看起来有点令人惊讶,但这反过来可能会成为一个问题。

public static class Factory {
   public static IActivity<someType> Get(this someType self){
          //stuff specific to someType
   }

   public static IActivity<someOtherType> Get(someOtherType self){
          //stuff specific to someOtherType
   }

   public static T Creator<T>(){
        return null;
   }

}

用法将是

IActivity<someType> act = Factory.Creator<someType>().Get(); 

当然,只有当你可以通过一个具体的类型。如果需要传递类型参数,事情会变得更复杂。

曹理
2023-03-14

您应该创建泛型方法,否则编译器将不知道返回值中T的类型。当您拥有T时,您将能够根据T的类型创建活动:

class Factory
{
    public IActivity<T> GetActivity<T>()
    {
        Type type = typeof(T);
        if (type == typeof(DataTable))
            return (IActivity<T>)new ReportActivityManager();
        // etc
    }
}

用法:

IActivity<DataTable> activity = factory.GetActivity<DataTable>();
 类似资料:
  • 问题内容: 我第一次尝试AngularJS。我正在使用工厂从http-get请求中获取JSON数据,但是在完成ajax请求之前,该对象返回为空。 厂: 控制器: 这就是我想出的。当控制器设置$ scope.photos时,该值为空,就好像它在填充ajax响应之前返回photos数组。 问题答案: 您应该修改代码以返回承诺并使用控制器中的值,请参见伪修改后的代码 和控制器-

  • 问题内容: 我是AngularJS的新手,因此遇到了这个问题。 我可以在所有注入了控制器的工厂中重新注入我的工厂单例对象吗? 例如: 在MedicalCenterController中,当应用程序启动时,我得到了带有医疗中心的单例对象: 但是稍后,我尝试在AccountProfileController中编辑医疗中心字段(名称,地址等)。 我期望的是具有更新字段的对象。如何返回我的单身人士的新实例

  • 问题内容: 这就是我想要做的。使用反射,我想获取所有方法及其返回类型(非泛型)。我一直在这样做。但是,当我遇到返回类型未知的方法时,我遇到了限制。 我如何知道方法的返回类型是否通用?我没有奢求在运行时拥有对象。我正在尝试使用Google 或使用抽象类来获取类型信息。我想关联到对象的方法。 有人认为Java不保留通用信息。在这种情况下,为什么第一次强制转换有效而第二次强制转换无效。 任何帮助表示赞赏

  • 我有hooks.java用于驱动程序类,loginpage.java用于所有登录页面对象和步骤定义类。我的页面工厂对象没有在我的登录类中初始化,它返回null由于null驱动程序。具有@before标记的驱动程序类,它的initiate在除驱动程序之外的所有类之前为空。当我使用PageFactory.InitElements(driver、LoginPage.Class)时;在时间页工厂初始化的钩

  • 我不确定这在Java中是否可行。而且,我也不知道该在谷歌上查询什么。无论如何,我想要一个方法,它将一个类(接口或类)作为参数,并且该方法的返回类型是该类的一个实例。我不想事后重铸一个物体。 我不确定这个功能是否存在,或者语法是什么。假设我有一个名为XYZ的类,这是我的伪方法。 现在假设XYZ是某种通用语法。这在Java中可能吗?谢谢你的帮助。

  • 我在我的程序中使用Hibernate注释,但它出错了。它没有返回我打开的会话工厂。我使用了netbean IDE,当我调试我的程序时,它想打开一个会话,下一步,它会转到,而不做任何其他事情。 这是我的文件夹。 在此输入图像描述 这是我的hibernate util 是我的类得到了会话工厂,但是得到了错误 然后在下一步之后也去上这门课 在此输入图像描述