如何重写返回泛型对象列表的函数,这些泛型对象使用特定对象扩展基类
本文关键字:对象 泛型 基类 扩展 何重写 重写 列表 返回 函数 | 更新日期: 2023-09-27 18:15:38
我有一个基类(Company),并希望从中派生几个类(例如CompanyA, CompanyB等)。
这个基类有一个抽象方法,所以所有的派生类都必须重写并实现它。
问题在于这个抽象方法应该能够返回从给定类(比如CustomerContact)派生的任何对象的列表。
我尝试在基类中定义这个方法,如下所示:
public class Company
{
...
public abstract List<T> getContacts<T>() where T : CustomerContact;
}
这不会产生编译错误。我尝试在派生类中重写此方法,如下所示:
public class CompanyA : Company
{
...
public override List<T> getContacts<T>()
{
return _contacts;
}
}
这里_contacts是类" companycontact "的列表,该类派生自"CustomerContact"。
但是,我不能像这样重写方法。我得到的错误是:
Cannot implicitly convert type 'System.Collections.Generic.List<CompanyAContact>' to 'System.Collections.Generic.List<T>'
您在派生类中的方法被定义为通用但返回CompanyAContact
的具体列表-如果您像这样调用该方法会发生什么?:
CompanyA companyA = new CompanyA();
//we can't do this as the method returns List<CompanyAContact>
//but we would be asking it for List<CompanyBContact>
companyA.getContacts<CompanyBContact>();
因为这不会有任何意义,你收到的错误,你不能从List<CompanyAContact>
转换到List<T>
。当方法定义为可以返回任何 CompanyContact
的方式时,您不能返回List<CompanyAContact>
。
一个解决方案是使基本Company
类本身泛型,并在继承Company
:
CompanyContact
类型。abstract class BaseCompany<T> where T : CustomerContact
{
//When we inherit from BaseCompany we can define T
public abstract List<T> getContacts();
}
//define T in this case as CompanyACustomerContact
class CompanyA : BaseCompany<CompanyACustomerContact>
{
public override List<CompanyACustomerContact> getContacts()
{
return new List<CompanyACustomerContact>();
}
}
//define T in this case as CompanyBCustomerContact
class CompanyB : BaseCompany<CompanyBCustomerContact>
{
public override List<CompanyBCustomerContact> getContacts()
{
return new List<CompanyBCustomerContact>();
}
}
我没有visualstudio在我面前检查,但我怀疑你需要在这里也添加类型约束,以显示此方法与抽象方法兼容:
public class CompanyA : Company
{
...
public override List<T> getContacts<T>() where T : CustomerContact;
{
return _contacts;
}
}
您可以返回CustomerContact类的列表,然后从中派生特定的类,如mobile, email…
尝试将基类改为泛型:
public class CustomerContact
{
// ...
}
public class CompanyAContact : CustomerContact
{
// ...
}
public abstract class Company<T> where T : CustomerContact
{
// ...
public abstract List<T> GetContacts();
}
public class CompanyA : Company<CompanyAContact>
{
private List<CompanyAContact> _contacts;
// ...
public override List<CompanyAContact> GetContacts()
{
return _contacts;
}
}