Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jul 15th, 2012  |  syntax: None  |  size: 3.63 KB  |  hits: 16  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Automatic creation of derived classes from an associated settings class?
  2. public abstract class BaseClass
  3. {
  4.     public BaseClass() { }
  5.  
  6.     public abstract BaseClassSettings Write();
  7. }
  8.  
  9. public class BaseClassSettings
  10. {
  11.  
  12. }
  13.        
  14. public class DerivedFoo : BaseClass
  15. {
  16.     public DerivedFoo(DerivedFooSettings settings)
  17.     {
  18.          // Apply settings
  19.     }
  20.  
  21.     public override BaseClassSettings Write()
  22.     {
  23.         DerivedFooSettings settings = new DerivedFooSettings();
  24.  
  25.         return settings;
  26.     }
  27. }
  28.  
  29. public class DerivedFooSettings : BaseClassSettings
  30. {
  31.  
  32. }
  33.  
  34. public class DerivedBar : BaseClass
  35. {
  36.     public DerivedBar(DerivedBarSettings settings)
  37.     {
  38.          // Apply settings
  39.     }
  40.  
  41.     public override BaseClassSettings Write()
  42.     {
  43.         DerivedBarSettings settings = new DerivedBarSettings();
  44.  
  45.         return settings;
  46.     }
  47. }
  48.  
  49. public class DerivedBarSettings : BaseClassSettings
  50. {
  51.  
  52. }
  53.        
  54. DerivedFoo foo = new DerivedFoo();
  55. DerivedBar bar = new DerivedBar();
  56.  
  57. BaseClassSettings[] s = new BaseClassSettings[2];
  58. s[0] = foo.Write();
  59. s[1] = bar.Write();
  60.        
  61. if (BaseClassSettings is DerivedFooSettings)
  62.     new DerivedFoo(settings)
  63. else if (BaseClassSettings is DerivedBarSettings)
  64.     new DerivedBar(settings)
  65.        
  66. [
  67.     XmlInclude(typeof(DerivedSettingsClassA)),
  68.     XmlInclude(typeof(DerivedSettingsClassB)),
  69.     XmlInclude(typeof(DerivedSettingsClassC)),
  70.     XmlInclude(typeof(DerivedSettingsClassD)),
  71.     XmlInclude(typeof(DerivedSettingsClassE)),
  72. ]
  73. public abstract class BaseSettingsClass
  74. {
  75.     public abstract DerivedClass Load(Game1 game, OutputDimensionSettings settings);
  76. }
  77.        
  78. public abstract class BaseClass
  79. {
  80.   public abstract BaseClassSettings Write();
  81. }
  82.  
  83. public abstract class BaseClassSettings
  84. {
  85.   public abstract BaseClass CreateCorrespondingInstance();
  86. }
  87.        
  88. public class DerivedFoo : BaseClass            
  89. {            
  90.   public DerivedFoo(DerivedFooSettings settings)              
  91.   {              
  92.     // Apply settings            
  93.   }            
  94.  
  95.   public override BaseClassSettings Write()            
  96.   {            
  97.     DerivedFooSettings settings = new DerivedFooSettings();            
  98.     return settings;            
  99.   }            
  100. }            
  101.  
  102. public class DerivedFooSettings : BaseClassSettings            
  103. {            
  104.   public override BaseClass CreateCorrespondingInstance()
  105.   {
  106.     return new DerivedFoo(this);
  107.   }
  108. }
  109.        
  110. [System.AttributeUsage(System.AttributeTargets.Class)]
  111.     public class BaseClassLinkAttribute : System.Attribute
  112.     {
  113.         public System.Type LinkedType { get; set; }
  114.  
  115.         public BaseClassLinkAttribute(Type linkedType)
  116.         {
  117.             // Probably wat to make sure type is derrived from BaseClass
  118.             LinkedType = linkedType;
  119.         }
  120.     }
  121.        
  122. public abstract class BaseClass
  123. {
  124.     public BaseClass()
  125.     {
  126.     }
  127.  
  128.     public abstract BaseClassSettings Write();
  129.  
  130.     public static BaseClass CreateFromSettings(BaseClassSettings settings)
  131.     {
  132.         Attribute attr = Attribute.GetCustomAttribute(settings.GetType(), typeof(BaseClassLinkAttribute));
  133.  
  134.         // Check for null here and throw exception if attribute can't be found in prduction code
  135.  
  136.         BaseClassLinkAttribute linkAttribute = (BaseClassLinkAttribute)attr;
  137.  
  138.         // This is only going to work if class implements a constructor
  139.         // that take a base settings class
  140.  
  141.         return (BaseClass)Activator.CreateInstance(linkAttribute.LinkedType,settings);
  142.     }
  143. }
  144.        
  145. [BaseClassLink(typeof(DerivedFoo))]
  146. public class DerivedFooSettings : BaseClassSettings
  147. {
  148. }
  149.        
  150. DerivedFooSettings x = new DerivedFooSettings();
  151.  
  152.        BaseClass y = BaseClass.CreateFromSettings(x);
  153.  
  154.        Console.WriteLine(y.GetType().FullName);