CTP рдореЗрдВ CRTP рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдХрд░рдирд╛

CRTP ( рдШреБрдВрдШрд░рд╛рд▓реЗ рдЖрд╡рд░реНрддреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрдЯрд░реНрди ) рдПрдХ рдореБрд╣рд╛рд╡рд░рд╛ рд╣реИ рдЬреЛ C ++ рд╕реЗ рдЕрдкрдиреА рдЬрдбрд╝реЗрдВ рдмрдврд╝рд╛ рд░рд╣рд╛ рд╣реИред CRTP рдХрд╛ рд╕рд╛рд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╡рд░реНрдЧ рд╣реА рд╣реИред

рдХреЛрдб рдореЗрдВ, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ:
public class Base<T> where T : Base<T> { /* ... */ } public class Derived : Base<Derived> { /* ... */ } 

рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдХреЛрдб рдореЗрдВ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ (рдЯреА) рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреАред

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


рдЗрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рд╡рд░реНрдЧреАрдп рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
 public class Rectangle<T> where T : Rectangle<T> { int _width; int _height; public T SetWidth(int width) { _width = width; return (T)this; } public T SetHeight(int height) { _height = height; return (T)this; } } public class Frame : Rectangle<Frame> { Color _color; public Frame SetColor(Color color) { _color = color; return this; } } 

рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг:
 var frame = new Frame() .SetWidth(100) .SetHeight(200) .SetColor(Color.White); 

SetColor () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддреА рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ SetWidth () / SetHeight () рд╡рд┐рдзрд┐рдпрд╛рдБ Rectangle рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рднреА рдлрд╝реНрд░реЗрдо рдХреНрд▓рд╛рд╕ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддреА рд╣реИрдВред

рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╡рд░реНрдЧ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

TSERializer рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ TItem рддрддреНрд╡реЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВ:
 public abstract class SerializerBase<TSerializer, TItem> where TSerializer : SerializerBase<TSerializer, TItem>, new() { readonly static TSerializer _serializer; static SerializerBase() { _serializer = new TSerializer(); } public abstract void WriteAsBinary(TItem item, BinaryWriter writer); public static void Save(TItem item, BinaryWriter writer) { _serializer.WriteAsBinary(item, writer); } public static void Save(IList<TItem> items, BinaryWriter writer) { writer.Write(items.Count); foreach (var item in items) _serializer.WriteAsBinary(item, writer); } public static void Save(string name, TItem item, BinaryWriter writer) { writer.Write(name); _serializer.WriteAsBinary(item, writer); } } 

SerializerBase рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ рджреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ TSerializer рдХреЛ рдПрдХ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ SerializerBase рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реЛред рдЕрдВрджрд░, рдПрдХ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдерд┐рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХрд╛ рд╕рд┐рдВрдЧрд▓рдЯрди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИред рдЕрддрд┐рднрд╛рд░рд┐рдд рд╕рд╣реЗрдЬреЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рдХрд┐рд╕реА рдПрдХрд▓ рдкрд░ WriteAsBinary рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИрдВ:
 public class GeoPoint { public double Lat { get; set; } public double Lon { get; set; } } public class GeoPointSerializer : SerializerBase<GeoPointSerializer, GeoPoint> { public override void WriteAsBinary(GeoPoint item, BinaryWriter writer) { writer.Write(item.Lat); writer.Write(item.Lon); } } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рддрддреНрд╡ рдХреЗ рдХреНрд░рдорд╛рдВрдХрди рдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ GeoPointSerializer.Save рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддрддреНрд╡ рдФрд░ рдордирдорд╛рдиреА рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреА рд╕реВрдЪреА рдХреЛ TItem рдХреЗ рд╕рд╛рде рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 GeoPoint[] region = new GeoPoint[] { new GeoPoint { Lat = 0.0, Lon = 0.0 }, new GeoPoint { Lat = -25, Lon = 135 }, new GeoPoint { Lat = -20, Lon = 46} }; GeoPoint gp = new GeoPoint() { Lat = -3.065, Lon = 37.358 }; byte[] bytes; using (MemoryStream ms = new MemoryStream()) using (BinaryWriter writer = new BinaryWriter(ms)) { GeoPointSerializer.Save("Mount Kilimanjaro", gp, writer); GeoPointSerializer.Save(region, writer); bytes = ms.ToArray(); } 

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

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


All Articles