如何重写返回泛型对象列表的函数,这些泛型对象使用特定对象扩展基类

本文关键字:对象 泛型 基类 扩展 何重写 重写 列表 返回 函数 | 更新日期: 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;
    }
}