title: Remove dependency on inherited abstract class references
body: <p>I am trying to setup a scenario where we can create a common set of models for our workgroup and then implement or extend them if/when needed.  </p>
  
  <p>I have the following setup:</p>
  
  <pre><code>namespace Workgroup.DomainClasses
  {
      public abstract class WorkGroupOrder
      {
         private ICollection&lt;WorkGroupItems&gt; _items;
  
         protected WorkGroupOrder()
         {
             _items = new List&lt;WorkGroupItems&gt;();
         }
         protected int OrderId { get; set; }
         protected virtual ICollection&lt;WeAccount&gt; Items
         {
             get { return _items; }
             set { _items = value; }
         }
      }
  }
  </code></pre>
  
  <p>I would prefer that users not use the base <code>WorkGroupOrder</code> so would like to set this up so they are required to implement their own version of the class.  If all is good with the base class it would simply be an empty class calling the base constructor but otherwise properties and functionality could be added.  The idea for this is that the Workgroup domain is much larger than may be necessary for a single project but we'd like to drive all work from this common model.</p>
  
  <pre><code>using Workgroup.DomainClasses;
  namespace Project.DomainClasses
  {
      public class Order : WorkGroupOrder
      {
          public string OrderComment { get; set; }
      }
  }
  </code></pre>
  
  <p>The issue I'm having is that I'm required to reference both domain models to implement.  There is an error below in the Testing() method that I must also reference <code>Workgroup.DomainClasses</code> in order to instantiate the class.  I'm not that familiar with abstract classes so is this just the nature of the abstract type?  I'd prefer to remove this dependency if possible.</p>
  
  <pre><code>using Project.DomainClasses;
  namespace Project.DataLayer
  {
      public class Testing
      {
          public void Testing()
          {
              Order o1 = new Order();
          }
      }
  }
  </code></pre>
  
  <p>A few questions.</p>
  
  <ol>
  <li>Does this organization make sense or is there a better way to
      support my desire of providing a common model that could potentially
      be extended? 
  <li>How would I access the properties of both the base
      abstract class and the concrete class?  In my Testing() method I am unable
      to access `o1.OrderId` for example. 
  <li>I'd like to remove meta-knowledge of the abstract class from the developer.  How would it be best to execute the constructor without explicitly requiring the developer to do so?
  </ol>
  
  <p>Ultimately I'd like to require developers to create their own instance of the class to avoid implementing the base model directly.  I'd also like to build in the proper visibility to prevent them from going directly to the Workgroup objects.</p>