Интерфейсы и методы с общими типами

Вопрос:

У меня есть два небольших класса: Pet и Book каждый из которых имеет пару свойств и функцию с таким методом, как

 public static List<T> GetSubSet<T>(List<T> incomingList)
{
var returnList = new List<T>();
Random r = new Random();
Console.WriteLine("Enter size of random subset: ");
int randomInt = 0;
int size = Convert.ToInt32(Console.ReadLine());
while (size > incomingList.Count)
{
Console.WriteLine("Size too large, enter smaller subset: ");
size = Convert.ToInt32(Console.ReadLine());
}

while (returnList.Count < size)
{
randomInt = r.Next(incomingList.Count);
if (!returnList.Contains(incomingList[randomInt]))
{
returnList.Add(incomingList[randomInt]);
}
}

return returnList;
}

который принимает общий список объектов и возвращает меньшее подмножество. Функция работает и может принимать объект Pet или Book. Я хотел бы использовать ту же функцию в списке, который содержит как Pet и бронирование типов. Лучший способ, которым я знаю, как это сделать, — это интерфейс (наследование здесь не имеет смысла).

interface ISubset<T>
{

IEnumerable<T> GetSubset();
}

Когда я реализую интерфейс в своем классе Pet, это выглядит

  class Pet : ISubset<Pet>

В моем основном классе у меня есть список домашних животных и книг. Я хотел бы добавить оба этих списка в ISubset объектов ISubset чтобы я мог использовать функцию GetSubset для обоих. Однако я не могу объявить список, например

List<ISubset<T>> list = new List<ISubset<T>>();

Я получаю ошибку 'the type or namespace T could not be found.
Как я могу объявить список объектов ISubset, когда интерфейс принимает общий тип?

Хорошо, у меня есть два списка:

List<Pet> petList = new List<Pet>();
petList.Add(new Pet() { Name = "Mr.", Species = "Dog" });
petList.Add(new Pet() { Name = "Mrs.", Species = "Cat" });
petList.Add(new Pet() { Name = "Mayor", Species = "Sloth" });
petList.Add(new Pet() { Name = "Junior", Species = "Rabbit" });


List<Book> bookList = new List<Book>();
bookList.Add(new Book() { Author = "Me", PageCount = 100, Title = "MyBook" });
bookList.Add(new Book() { Author = "You", PageCount = 200, Title = "YourBook" });
bookList.Add(new Book() { Author = "Pat", PageCount = 300, Title = "PatsBook" });

Какой должен быть тип, если я хочу добавить эти списки вместе в другой список?

Лучший ответ:

Вы можете просто использовать List<object>, но если вы хотите сделать это так, как вы предлагаете, вам нужно создать интерфейс с подписью, которая охватывает оба ваших класса

public interface IGen
{
    int A;
    int Method;
}

Затем наследуйте/реализуйте этот интерфейс в своих классах

public class Pet : IGen
{
    public int A { get; set; }
    private int Method(){ ... }
}

public class Book : IGen
{
    public int A { get; set; }
    private int Method(){ ... }
}

Затем вы можете перейти в свой GetSubSet как

GetSubSet<IGen>(List<IGen> incomingList) { ... }

Надеюсь, это поможет.

Ответ №1

List<object> должен работать нормально.

В LinqPad было протестировано следующее:

void Main()
{
List<Pet> petList = new List<Pet>();
petList.Add(new Pet() { Name = "Mr.", Species = "Dog" });
petList.Add(new Pet() { Name = "Mrs.", Species = "Cat" });
petList.Add(new Pet() { Name = "Mayor", Species = "Sloth" });
petList.Add(new Pet() { Name = "Junior", Species = "Rabbit" });


List<Book> bookList = new List<Book>();
bookList.Add(new Book() { Author = "Me", PageCount = 100, Title = "MyBook" });
bookList.Add(new Book() { Author = "You", PageCount = 200, Title = "YourBook" });
bookList.Add(new Book() { Author = "Pat", PageCount = 300, Title = "PatsBook" });

List<object> both = petList.OfType<object>().Union(bookList.OfType<object>()).ToList().Dump();
}

// Define other methods and classes here
public class Pet
{
public string Name { get; set; }
public string Species { get; set; }
}

public class Book
{
public string Author { get; set; }
public int PageCount { get; set; }
public string Title { get; set; }
}

Оцените статью
TechArks.Ru
Добавить комментарий