рдЬреЗрдиреЗрд░рд┐рдХ рдХреА рдХрд▓рд╛

рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ - рд╡реЗ рднреА рдЬреЗрдирд░рд┐рдХ рд╣реИрдВ, рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред

рд╕реАрдПрд▓рдЖрд░ рдПрдордПрд╕рдЖрдИрдПрд▓ рд╕реНрддрд░ рдФрд░ рд╕рдВрдкреВрд░реНрдг рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдЪрд╛рд▓реЗрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреНрд░реИрдВрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрджрд┐ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрдиреБрдЧреНрд░рд╣ рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ C # рдСрдкрд░реЗрд╢рди рд╕реЗ рд╣реАрди рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛


рдХреЛрдб рдХреЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдВрдЧрдарди рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдУрдУрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдорддреМрд░ рдкрд░ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

[ рдиреЛрдЯ: рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рд╛рде "рдЯреНрд░рд┐рдХреНрд╕" рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╣реИред рд▓реЗрдЦрдХ рд╕рд┐рд░реНрдл рд╡рд┐рдЪрд╛рд░ рдХреА рдЯреНрд░реЗрди рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ ред]

MVC рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИред рдЬрд╣рд╛рдВ, рдирд┐рдпрдВрддреНрд░рдХ рдкрдХреНрд╖ рдкрд░ рддрд░реНрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдХрд╛рд░рдЦрд╛рдиреЗ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде (рдПрдХ рд╕рд╛рд░ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП)ред

рдЙрдирдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ GoF рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЯрд░реНрди рд╣реИрдВ:

рдкрд╣рд▓реЗ рдХрд╛ рд╕рд╛рд░ рдПрдХрд▓ рдкреНрд░реЗрд╖рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реИ - рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдУрд╡рд░рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C # 4 рдФрд░ рдЗрд╕рдХреЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрд▓рддрд╛рди рдкреНрд░реЗрд╖рдг
class Program { class Thing { } class Asteroid : Thing { } class Spaceship : Thing { } static void CollideWithImpl(Asteroid x, Asteroid y) { Console.WriteLine("Asteroid collides with Asteroid"); } static void CollideWithImpl(Asteroid x, Spaceship y) { Console.WriteLine("Asteroid collides with Spaceship"); } static void CollideWithImpl(Spaceship x, Asteroid y) { Console.WriteLine("Spaceship collides with Asteroid"); } static void CollideWithImpl(Spaceship x, Spaceship y) { Console.WriteLine("Spaceship collides with Spaceship"); } static void CollideWith(Thing x, Thing y) { dynamic a = x; dynamic b = y; CollideWithImpl(a, b); } static void Main(string[] args) { var asteroid = new Asteroid(); var spaceship = new Spaceship(); CollideWith(asteroid, spaceship); CollideWith(spaceship, spaceship); } } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рдЕрдзрд┐рднрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди рдЕрдм рдбрдмрд▓ рдкреНрд░реЗрд╖рдг рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

рджреЛрд╣рд░рд╛ рдкреНрд░реЗрд╖рдг
 class Program { interface ICollidable { void CollideWith(ICollidable other); } class Asteroid : ICollidable { public void CollideWith(Asteroid other) { Console.WriteLine("Asteroid collides with Asteroid"); } public void CollideWith(Spaceship spaceship) { Console.WriteLine("Asteroid collides with Spaceship"); } public void CollideWith(ICollidable other) { other.CollideWith(this); } } class Spaceship : ICollidable { public void CollideWith(ICollidable other) { other.CollideWith(this); } public void CollideWith(Asteroid asteroid) { Console.WriteLine("Spaceship collides with Asteroid"); } public void CollideWith(Spaceship spaceship) { Console.WriteLine("Spaceship collides with Spaceship"); } } static void Main(string[] args) { var asteroid = new Asteroid(); var spaceship = new Spaceship(); asteroid.CollideWith(spaceship); asteroid.CollideWith(asteroid); } } 


рдареАрдХ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдЧрддрд┐рд╢реАрд▓ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рддреЛ рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ?

рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╕рд░рд▓ рд╣реИ - рдпрджрд┐ рд╣рдо рдПрдХрд▓ рдкреНрд░реЗрд╖рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рд╣реИ, рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ ( рдХрдИ рдбрд┐рд╕реНрдкреИрдЪ ) рдкрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?!

ред рдХреЛрд╡рд░рд┐рдпрдирд╕ && рдХрдВрдЯреНрд░рд╛рд╡реЗрд░рд┐рдпрди


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрд╡рд░рд┐рдпрди рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреА рдЧрдИ рд▓рдЧрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 var asteroid = new Asteroid(); ICollidable collidable = asteroid; 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрдЧрддрддрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдХреЛрд╡рд░рд┐рдпрди рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред

 List<Asteroid> asteroids = new List<Asteroid>(); IEnumerable<ICollidable> collidables = asteroids; 

IEnumerable рдШреЛрд╖рдгрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

 public interface IEnumerable<out T> : IEnumerable { IEnumerator<T> GetEnumerator(); } 

рдЖрдЙрдЯ рдХреАрд╡рд░реНрдб рдФрд░ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рд╕рдорд░реНрдерди рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ, рд╕реВрдЪреА <T> рд╡рд░реНрдЧ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╕реВрдЪреА <рдХреНрд╖реБрджреНрд░рдЧреНрд░рд╣> рдкреНрд░рдХрд╛рд░ рдХреЛ IEnumerable <ICollidable> рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рджреВрд╕рд░реЗ рд╡рд░реНрдЧ рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 interface ICustomInterface<out T> { T Do(T target); //compile-time error T Do(IList<T> targets); //compile-time error } 

рдареАрдХ рд╣реИ, рдЖрдЗрдП рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдзреНрдпрд╛рди рджреЗрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдХреА рдУрд░ рдмрдврд╝реЗрдВ - рд╣рдо рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред

тЦМ рдЬреЗрдирд░рд┐рдХ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреА рдЬрд╛рдБрдЪ


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 public interface IReader<T> { T Read(T[] arr, int index); } 

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдпрд╛ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП? рдпрд╛рдиреА рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рд╛рдЧреВ рдХрд░реЗрдВ?

C # рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЯрд╛рдЗрдкреНрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд░рдЪрдирд╛, рд╡рд░реНрдЧ, рдпрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ (рд╡рд╣рд╛рдБ рдЕрднреА рднреА рдирдпрд╛ () рд╣реИ) рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 public interface IReader<T> where T : class { T Read(T[] arr, int index); } 

рдХрдИ рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдХреНрд╖реБрджреНрд░рдЧреНрд░рд╣ рдЙрджрд╛рд╣рд░рдг рдпрд╛рдж рд╣реИ?

IReader рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

 public class SignedIntegersReader : IReader<Int32>, IReader<Int16>, IReader<Int64> { int IReader<int>.Read(int[] arr, int index) { return arr[index]; } short IReader<short>.Read(short[] arr, int index) { return arr[index]; } long IReader<long>.Read(long[] arr, int index) { return arr[index]; } } 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ - рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреНрдпреЛрдВ?

рдпрд╣ рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдЯреА рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, IListред

рдФрд░ рдЪреВрдВрдХрд┐ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕реА # рд╕рдорд░реНрдерди рдЕрд╕рдВрднрд╡ рд╣реИ, рддрджрдиреБрд╕рд╛рд░, рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдХрдИ рдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬрд╣рд╛рдВ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдФрд░ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреАред

рдЦреИрд░, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрди рдЕрд╡рд╕рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред

 public static class ReaderExtensions { public static T Read<TReader, T>(this TReader reader, T[] arr, int index) where TReader : IReader<T> { return reader.Read(arr, index); } } class Program { static void Main(string[] args) { var reader = new SignedIntegersReader(); var arr = new int[] {128, 256}; for (int i = 0; i < arr.Length; i++) { Console.WriteLine("Reader result: {0}", reader.Read(arr, i)); } } } 

рдЪрд▓рд┐рдП рдлреНрд▓реЛрдЯ [] рдХреЗ рдЪрд░ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

 class Program { static void Main(string[] args) { var reader = new SignedIntegersReader(); var arr = new float[] {128.0f, 256.0f}; for (int i = 0; i < arr.Length; i++) { Console.WriteLine("Reader result: {0}", reader.Read(arr, i)); //compile-time error } } } 

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?! рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

рд╣рдо рдЕрдкрдиреЗ IReader рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВрдЧреЗред

IReader <рдЯреА>
 public interface IReader<T> { T Read(T[] arr, int index); bool Supports<TType>(); } public class SignedIntegersReader : IReader<Int32>, IReader<Int16>, IReader<Int64> { int IReader<int>.Read(int[] arr, int index) { return arr[index]; } short IReader<short>.Read(short[] arr, int index) { return arr[index]; } long IReader<long>.Read(long[] arr, int index) { return arr[index]; } public bool Supports<TType>() { return this as IReader<TType> != null; } } 


рдФрд░ IReader рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗрдВ - DefaultReaderред

 public class DefaultReader<T> : IReader<T> { private IReader<T> _reader = new SignedIntegersReader() as IReader<T>; public T Read(T[] arr, int index) { if (_reader != null) { return _reader.Read(arr, index); } return default(T); } public bool Supports<TType>() { return _reader.Supports<TType>(); } } 

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

 class Program { static void Main(string[] args) { var reader = new DefaultReader<int>(); var arr = new int[] { 128, 256 }; if (reader.Supports<int>()) { for (int i = 0; i < arr.Length; i++) { Console.WriteLine("Reader result: {0}", reader.Read(arr, i)); } } } } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдорд╛рдирдХреАрдХреГрдд рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдУрд╡рд░рд▓реЛрдб рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓реЗ - рд╕рдВрдХрд▓рди рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рджреЛрдиреЛрдВ рдХреЗ рджреМрд░рд╛рдиред

Source: https://habr.com/ru/post/In201996/


All Articles