using System; using System.IO; namespace ConsoleApp1 { class Program { static void Main(string[] args) { var logger = new MyLogger(); IWriteable logger2 = new MyLogger2(); var reader = new MyReader(); var writer = new MyWriter(); } } interface IReadable { T Read(Stream s); } interface IWriteable { void Write(Stream s, T data); } interface ILogger : IReadable, IWriteable { } class MyLogger : ILogger { public T Read(Stream s) { throw new NotImplementedException(); } public void Write(Stream s, T data) { throw new NotImplementedException(); } } class MyLogger2 : IReadable, IWriteable { public T Read(Stream s) { throw new NotImplementedException(); } public void Write(Stream s, T data) { throw new NotImplementedException(); } } class MyReader : IReadable { public T Read(Stream s) { throw new NotImplementedException(); } } class MyWriter : IWriteable { public void Write(Stream s, T data) { throw new NotImplementedException(); } } abstract class MyAbstractLogger : ILogger { public T Read(Stream s) { try { return (T)new XmlSerializer(typeof(T)).Deserialize(s); } catch (Exception) { throw; } } public void Write(Stream s, T data) { try { new XmlSerializer(typeof(T)).Serialize(s, data); } catch (Exception) { throw; } } } class MyExceptionLogger : MyAbstractLogger { } class MyStringLogger : MyAbstractLogger { } }