当前位置: 首页 > 编程语言 > C#

C#泛型——如何返回特定类型?Share

时间:2023-04-10 18:56:48 C#

C#Generics-如何返回特定类型?也许我对这一切都错了。我有一堆派生自“模型”类的类,这是一个具有大量通用属性和方法的基类。我希望它们都实现一组功能:publicabstractvoidCreate();公共摘要T读取(GuidID);//<--关注这一个publicabstractvoidUpdate();公共抽象无效删除();然后我在像“约会”这样的子类中实现它:varappointment=newAppointment(){DateEnd=appt.dateEnd.GetValueOrDefault(),Location=appt.location,Summary=appt.summary};返回预约;这会引发异常“无法将类型‘约会’隐式转换为T”。如果我将方法的签名更改为“publicoverrideAppointmentRead(GuidID)”,那么编译器会说我还没有在子类中实现抽象方法。我错过了什么?谁能给我一些代码示例?看起来你可以使用一个通用的基类!考虑以下内容:classModel{publicabstractTRead(GuidID);}classAppointment:Model{publicoverrideAppointmentRead(GuidID){}}现在你的子类都是强类型的。当然,代价是您不再拥有基类。模型和模型。我通常不觉得这是一个问题,因为它几乎没有共同的功能——接口相似,但它们都使用不同的类型。如果你想要一个通用的基础,你当然可以作弊并实现一个基于对象的接口来完成同样的通用任务。例如,一些精神(未经测试,但想法是存在的):interfaceIModelEntity{objectRead(GuidID);}类模型:IModelEntity{publicTRead(GuidID){returnthis.OnRead(ID);//调用抽象读取实现}objectIModelEntity.Read(GuidID){returnthis.OnRead(ID);//调用抽象读取实现}protectedabstractvirtualTOnRead(GuidID);}classAppointment:Model{protectedoverrideAppointmentOnRead(GuidID){/*DoReadStuff*/}}这行得通吗?publicabstractTRead(GuidID)whereT:IAppointment;你需要装箱和施法。我想知道为什么这个方法是通用的?返回(T)(对象)约会;您必须先切换到对象,然后再切换到T,因为该对象位于继承链的顶部。Appointment与T没有直接联系;因此你必须回溯到对象,然后回到T。我提供了这个答案来解释为什么return语句将不起作用,除非它被双重推导-并支持Chaos&Greg首先给出的答案,我建议你把基类变成一个接口。如果这是您的选择,这也可以减少稍微混乱的代码,因为您可以摆脱接口声明中的abstract和public关键字,并省略实现类中的覆盖。其次,正如您的Appointment.Read实现所暗示的那样,您可以更改Read的方法签名以返回模型对象。两个建议的更改都会导致以下结果:publicinterfaceIModel{voidCreate();IModel读取(GuidID);无效更新();无效删除();第三,在我看来,Read应该是一个工厂方法。在您当前的代码中,您需要先实例化一个Appointment对象,然后才能调用Read方法来检索另一个Appointment对象。从类设计的角度来看,这对我来说似乎是错误的。我怎样才能从基类/接口中取出Read并使其在所有派生/实现类中作为静态方法可用?例如:publicclassAppointment:IModel{publicstaticAppointmentRead(GuidID){returnnewAppointment(){...};您还可以考虑将Read移动到静态(工厂)类中;然而,Smart必须知道它应该返回什么样的对象。例如,如果您的数据库中有一个将GUID映射到相应对象类型的表,这将起作用。编辑:上面的最后一个建议曾经是这样的:第三,如果到目前为止这是正确的,下一个问题是Read是否应该是静态方法。如果是这样,可以将其设为静态并移至静态模型类中。该方法就像一个从数据库构建IModel对象的工厂方法:Guidguid=...;IModelsomeModel=Model.Read(guid);这个设计有点古怪。无论Model类是否模板化,将模板参数作为实例方法放在Read方法上没有多大意义。通常你会得到类似于GregD发布的内容。如果publicabstractTRead(GuidID);Model只会返回派生类型的Model,考虑将签名改为publicabstractclassModel{publicabstractvoidCreate();公共抽象模型读取(GuidID);//在你的AddthistotheAppointmentclasspublicclassAppointment:ModelwhereT:Appointment你也可以调用:varx=myModel.Read();以上是C#学习教程:C#泛型——如何返回特定类型?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: