从非泛型类调用抽象泛型类中定义的方法的最佳方法是啥

     2023-03-31     8

关键词:

【中文标题】从非泛型类调用抽象泛型类中定义的方法的最佳方法是啥【英文标题】:What is the best way to call a method defined inside an abstract generic class from a non generic class从非泛型类调用抽象泛型类中定义的方法的最佳方法是什么 【发布时间】:2021-09-14 18:53:48 【问题描述】:

我不想让B类泛型,因为有很多类继承自B类。如何在非泛型类中使用泛型类“classA”的方法“GetSomeData”?

这是我的代码:

public abstract class classA<T> : IInterface<T>
    where T : new()

  public String GetSomeData (Guid ID)
  
    return somestring;       
  


public abstract class ClassB : InterfaceB

//Use GetSomeData(Guid ID) here

在 B 类中调用 GetSomeData 的最佳方法是什么?

【问题讨论】:

非常不清楚这两种类型如何相互关联。您想要实现但无法编译的代码示例会很有帮助。 【参考方案1】:

首先,您的代码本身看起来并不干净。未满足 C# 编码约定,并且并非所有使用的组件都存在。

但要回答您的问题,您需要在使用泛型方法/类之前指定具体类型 T。

例如,工作代码可能如下所示:

public abstract class GenericParent<T> 
  where T : new()

    public string GetSomeData(Guid id) => string.Empty;


// Non abstract type, to create be able to create an instance
public class GenericChild<T> : GenericParent<T> where T : new()




public abstract class ClassB

    public void DoSomething()
    
        // Creating instance of a generic type, specifying concrete T (in this case of type SomeClass)
        var instance = new GenericChild<SomeClass>();
        instance.GetSomeData(Guid.Empty);
    


// An example of type, that meets the "where" condition of T in the generic type
public class SomeClass



【讨论】:

【参考方案2】:

根据 OOP 原则,抽象类不能被实例化。 他们只能被继承。有几种方法可以访问 Abstract 类中的实例变量和方法,如下所示。

    创建一个继承抽象类的子类;创建一个子类对象并访问所有实例变量和方法。
    public abstract class classA<T> : IInterface<T>
            where T : ITask, new()
    
    
      public String GetSomeData (Guid ID)
      
        return somestring;       
      
    
    
    
    public class ChildOfClassA : ClassA<SomeType_of_Type_ITask>
    
    

    public abstract class ClassB : InterfaceB
    
    //Use GetSomeData(Guid ID) here
    ChildOfClassA obj = new ChildOfClassA();
    string result = obj.GetSomeData(Guid.NewGuid());
    
    如果该方法与类的实例没有紧密耦合,则将该方法设为静态。然后您可以将其与ClassName.MethodName 一起使用
    public abstract class classA<T> : IInterface<T>
            where T : ITask, new()
    
    
      public **static** String GetSomeData (Guid ID)
      
        return somestring;       
      
    
    
    
    public abstract class ClassB : InterfaceB
    
    //Use GetSomeData(Guid ID) here
    string result = classA.GetSomeData(Guid.NewGuid());
    
    你可以在你想使用的类中继承这个Abstract类,直接通过base.MethodName或者MethodName直接访问。
public abstract class classA<T> : IInterface<T>
            where T : ITask, new()
    
    
      public string GetSomeData (Guid ID)
      
        return somestring;       
      
    
    
    
    public abstract class ClassB : ClassA<SomeType_of_Type_ITask>, InterfaceB
    
    //Use GetSomeData(Guid ID) here
    string result = [base.]GetSomeData(Guid.NewGuid()); //[base.] is optional even you can override this function or overload it.
    

在情况 1 和 3 中,您必须传递泛型参数才能继承抽象类,因为在您的情况下,抽象类接受泛型参数。

【讨论】:

泛型方法或泛型类中的方法是内部调用pinvoke或是在com导入类中定义的。

泛型基类中引用Api函数定义时staticextern,在子类中会提示:未处理TypeLoadException泛型方法或泛型类中的方法是内部调用、PInvoke或是在COM导入类中定义的。解决方法:将定义Api函数封装到独立的类中即可publicclassGenericClass1<T>&nb... 查看详情

泛型类中的方法重载

】泛型类中的方法重载【英文标题】:Methodoverloadingingenericclass【发布时间】:2012-06-0502:51:26【问题描述】:我正在使用包含以下泛型类中的重载方法的代码:publicclassA<T>publicvoidProcess(Titem)/*impl*/publicvoidProcess(stringitem)/*impl*/... 查看详情

java——泛型类和泛型方法(静态方法泛型)

泛型类定义的泛型,在整个类中有效。如果被方法是用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。为了让不同的方法可以操作不同类型,而且类型还不确定。那么可以将泛型... 查看详情

201671010112第十周

...别重要吧,后续不懂的我都是在网上找资源。关于第八章泛型程序设计一、定义简单的泛型类泛型类:是具有一个或多个类型变量的类。类定义中的类型变量指定方法的返回类型以及域和局部变量的类型。二、泛型方法泛型方法... 查看详情

spring自定义泛型类中autowired注入为null

...单独拉出来写一个方法的话,入参又不同,所以想到了用泛型。比如这是一段公共代码://保存订单信息,需要多个方法调用OrderFilterRequest orderFilterRequest = new OrderFilterRequest();btOrderFilterRequest.setUserI 查看详情

泛型类中的静态方法?

】泛型类中的静态方法?【英文标题】:Staticmethodinagenericclass?【发布时间】:2010-10-3011:58:51【问题描述】:在Java中,我想要一些东西:classClazz<T>staticvoiddoIt(Tobject)//...但我明白了无法对非静态类型T进行静态引用除了基本用... 查看详情

泛型和枚举

泛型:用于解决安全问题,是一个安全机制.泛型格式;通过<>定义操作的引用数据类型。使用:当类中要操作的引用数据类型不确定的时候,早起定义Object来完成扩展,现在定义泛型类来扩展。泛型类定义的泛型,在整个类... 查看详情

泛型类的可选方法参数的类型

】泛型类的可选方法参数的类型【英文标题】:TypeforOptionalMethodArgumentofGenericClass【发布时间】:2021-08-0322:01:32【问题描述】:我想知道是否有一种方法可以声明具有默认泛型类型的泛型类:默认情况下允许在不传递参数的情况... 查看详情

泛型类,用克隆调用泛型类

】泛型类,用克隆调用泛型类【英文标题】:Genericclass,callinggenericclasswithclone【发布时间】:2018-03-2612:09:53【问题描述】:我需要用实现cloneable来创建一个泛型类,为此我需要执行该类的克隆方法和另一个方法来获取此方法。老... 查看详情

在 kotlin 中创建泛型类的新实例的正确方法是啥?

】在kotlin中创建泛型类的新实例的正确方法是啥?【英文标题】:Whatistheproperwaytocreatenewinstanceofgenericclassinkotlin?在kotlin中创建泛型类的新实例的正确方法是什么?【发布时间】:2014-11-1810:29:55【问题描述】:我使用以下初始化:... 查看详情

java泛型_泛型类接口通配符方法上下边界(代码片段)

文章目录①.泛型的概述②.泛型-类class③.泛型-接口④.泛型-通配符?⑤.泛型-方法⑥.泛型上下边界①.泛型的概述①.泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类... 查看详情

iPhone - 在泛型类中引用应用程序委托

】iPhone-在泛型类中引用应用程序委托【英文标题】:iPhone-Referencingtheapplicationdelegatewithinagenericclass【发布时间】:2011-07-3013:29:31【问题描述】:我正在编写一个可以通过链接在不同项目中使用的通用类。在某个时刻,我在一个监... 查看详情

泛型类方法的Typescript ReturnType问题

】泛型类方法的TypescriptReturnType问题【英文标题】:TypescriptReturnTypeproblemforgenericclassmethod【发布时间】:2022-01-1901:17:24【问题描述】:我正在使用打字稿:4.3.5我有一个抽象类:abstractclassParentpublicget<Type>(id:number):Observable<Ty... 查看详情

泛型学习笔记

...数化类型。使程序具有更好的可读性和安全性。优点:(泛型类,比如用于集合等容器类型时)1.编译器进行类型检查,避免插入错误类型的对象;2.输出时不需要类型的强制转换。 1.泛型类可以有多个类型变量。例:publiccla... 查看详情

java泛型泛型简介(泛型类|泛型方法|静态方法的泛型|泛型类与泛型方法完整示例)(代码片段)

文章目录一、泛型简介二、泛型类三、泛型方法四、静态方法的泛型五、泛型类与泛型方法完整示例一、泛型简介泛型可以简单理解为参数化类型,主要作用在类,方法,接口上;java泛型与C++模板:Java中的泛型,是仿照C++中... 查看详情

泛型类中的 T.class 等价物是啥? [复制]

】泛型类中的T.class等价物是啥?[复制]【英文标题】:What\'stheequivalentofT.classinagenericclass?[duplicate]泛型类中的T.class等价物是什么?[复制]【发布时间】:2018-01-1112:52:28【问题描述】:考虑以下通用转换器类(为简洁而简化/不完整... 查看详情

普通类、泛型类是啥

如题“泛型”,在英文版原文里写的是:generictype,直译就是:通用类型。generic这个单词里一点儿“泛”的意思可都没有啊!也不知是哪位大神整出“泛”型这么个概念的?!MSDN里最能说明它的一段话是这么写的:Fromthepointofvie... 查看详情

普通类、泛型类是啥

参考技术A“泛型”,在英文版原文里写的是:generictype,直译就是:通用类型。generic这个单词里一点儿“泛”的意思可都没有啊!也不知是哪位大神整出“泛”型这么个概念的?!MSDN里最能说明它的一段话是这么写的:Fromthepoi... 查看详情