如何继承具有不同泛型返回类型的方法

时间:2016-08-12 11:45:58

标签: c# generics

我试图继承一个返回类型为ServerType的Generic BindingList的方法。例如,我们说我有以下内容:

public interface IServer 
{

    string IpAddress { get; set; }
    string Name { get; set; }
    string HostName { get; set; }
    string OsVersion { get; set; }

}

public class BaseServer : IServer
{
    private string _IpAddress;
    private string _Name;
    private string _HostName;
    private string _OsVersion;

    public string IpAddress
    {
        get { return _IpAddress; }
        set { _IpAddress = value; }
    }

    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

    public string HostName
    {
        get { return _HostName; }
        set { _HostName = value; }
    }

    public string OsVersion
    {
        get { return _OsVersion; }
        set { _OsVersion = value; }
    }
}

public class ServerTypeA : BaseServer { }
public class ServerTypeB : BaseServer { }
public class ServerTypeC : BaseServer { }

public class ServerTypeList : List<ServerTypeA>
{ 

    public BindingList<ServerTypeA> ToBindingList()
    {
        BindingList<ServerTypeA> myBindingList = new BindingList<ServerTypeA>();

        foreach (ServerTypeA item in this.ToList<ServerTypeA>())
        {
            _bl.Add(item);
        }

        return _bl;

    }   
}

有什么方法可以做&#34; ToBindingList&#34;方法,而不必在每个派生的服务器类中重复它,并让它使用正确的泛型类型。

2 个答案:

答案 0 :(得分:2)

首先不要来自List<T>。而是使用它(favor composition over inheritance)。

然后让你的Repositories - 类通用:

public class Repository : Server
{ 

}

public class Repositories<T> where T: Server
{ 

    private List<T> theList = new List<T>();

    public Repositories<T>(List<T> theList) this.theList = theList; }

    public BindingList<T> ToBindingList()
    {
        BindingList<T> myBindingList = new BindingList<T>();

        foreach (Titem in this.theList)
        {
            _bl.Add(item);
        }

        return _bl;

    }   
}

现在你可以拥有Repositories - 来自Server的任意类的实例。

答案 1 :(得分:1)

首先,为您的所有馆藏创建一个基本列表:

public class MyListBase<T> : List<T>
    where T: Server
{ 
    public BindingList<T> ToBindingList()
    {
        BindingList<T> myBindingList = new BindingList<T>();
        foreach (T item in this.ToList<T>())
            myBindingList.Add(item);
        return myBindingList;
    }   
}

然后使用这个继承自:

public class Repositories : MyListBase<Repository>
{
}