Реализация классов на C#
У меня в проекте есть несколько классов, которые обладают общими свойствами:
У них у всех есть статический метод GetRandom() который возвращает случайный элемент соответствующего класса.
У всех есть метод ToString()
Например вот такой класс:
class MyClass
{
public int y;
public MyClass(int y)
{
this.y = y;
}
public static MyClass GetRandom()
{
var r = new Random();
return new MyClass(r.Next(0, 10));
}
public override string ToString()
{
return $"MyClass({y})";
}
}
Иногда с этими классами мне требуется выполнять одну и ту же последовательность действий, соответственно я решил вынести эту последовательность в функцию.
Например если мне нужно уметь выводить случайный элемент класса то я напишу такую функцию:
public static void PrintRandom<T>()
{
Console.WriteLine(T.GetRandom());
}
Такой код работать не будет. Насколько я понимаю C# просто не знает, что у T Есть метод GetRandom().
Как можно реализовать мою задумку?
Полный код программы:
class Program
{
class MyClass
{
public int y;
public MyClass(int y)
{
this.y = y;
}
public static MyClass GetRandom()
{
var r = new Random();
return new MyClass(r.Next(0, 10));
}
public override string ToString()
{
return $"MyClass({y})";
}
}
public static void PrintRandom<T>()
{
Console.WriteLine(T.GetRandom());
}
public static void Main()
{
Console.WriteLine(MyClass.GetRandom()); //Здесь все работает
PrintRandom<MyClass>(); // Здесь нет
}
}
Ответы (1 шт):
В C#11 в интерфейсах можно определять статические виртуальные методы: https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/static-virtual-interface-members Если C#11 использовать не получится, то придется переделывать структуру классов (делать GetRandom не-статическим).