.NET 2/3/4 / 4.5 / 4.6.1 & .Net Core 2.1 рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдирдореВрдирд╛ рдХреЛрдб рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрдпреЛрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ?
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ PrintIt<T>
рдХрд╛ рдХреЙрд▓ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ Bar
рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рднреА рд╕рд╣реА рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
interface PrintMe
{
void Print();
}
class Foo : PrintMe
{
public void Print()
{
Console.WriteLine("Foo!");
}
}
class Bar : Foo
{
public new void Print()
{
Console.WriteLine("Bar!");
}
}
class Program
{
static void Main(string[] args)
{
PrintIt<Foo>();
PrintIt<Bar>();
var foo = new Foo();
var bar = new Bar();
foo.Print();
bar.Print();
Console.ReadKey();
}
static void PrintIt<T>() where T : PrintMe, new()
{
new T().Print();
}
}
Foo!
Foo!
Foo!
Bar!
Foo!
Bar!
Foo!
Bar!
рдЬрдм рдЖрдк 'рдирдпрд╛' рдкреНрд░рд┐рдВрдЯ () рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣ рд╡рд┐рдзрд┐ PrintMe рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред
рдЖрдкрдХреЛ рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗрдЧрд╛
((PrintMe)new Bar()).Print();
рдХреЛрдИ рдЬреЗрдирд░рд┐рдХ рдирд╣реАрдВред
рдпрд╣ рдПрдХ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реАрдПрд▓рдЖрд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИред C # рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╣рддрд╛ рд╣реИ :
рдПрдХ рд╡рд░реНрдЧ рдЕрдкрдиреЗ рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗрддрд╛ рд╣реИред
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ
рдХрд▓реНрдкрдирд╛ рддрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рдЬреЛ рдКрдкрд░ рд╡рд╛рд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рд╣реИ, рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
c#
class Bar : Foo, PrintMe
{
public new void Print()
{
Console.WriteLine("Bar!");
}
}
@ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЬрдм рдЖрдк 'рдирдпрд╛' рдкреНрд░рд┐рдВрдЯ () рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣ рд╡рд┐рдзрд┐ PrintMe рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред
рдЖрдкрдХреЛ рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗрдЧрд╛
рдХреЛрдИ рдЬреЗрдирд░рд┐рдХ рдирд╣реАрдВред