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);
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); } }
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); } }
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(); }
Source: https://habr.com/ru/post/211743/
All Articles