Я пытался найти элегантное решение для повторяющейся проблемы в небольшой библиотеке, которую я пишу в C#.
Вот описание проблемы.
// IMPLEMENTATION
public class MyArgs : Args {}
public class MyItem : Item
{
public override void Run(Args args)
{
// CAN I AVOID THIS CAST?
var myArgs = args as MyArgs;
}
}
// LIBRARY
public class Args {}
public abstract class Item
{
public abstract void Run(Args args);
}
public class Manager
{
public List<Item> items;
public void RunAll (Args args)
{
foreach (Item item in items)
{
item.Run(args);
}
}
}
Так что, в принципе, я хотел бы иметь возможность отправлять MyArgs в MyItem через менеджера, не подозревая об этом. MyArgs - это что-то определенное пользователем, поэтому я буду знать только его базовый класс.
Я пробовал некоторые решения с использованием таких обобщений, как, например, которые решат проблему:
public abstract class Item<T>
{
public abstract void Run(T args);
}
Но я Я хотел бы избежать создания обобщенного менеджера c.
Так что я думаю, у меня вопрос, есть ли какие-нибудь приемы, которые я могу использовать, чтобы обойти это, или я просто пытаюсь сделать что-то, что невозможно.