第1回:http://blogs.wankuma.com/myugaru/archive/2008/03/04/126104.aspx
第2回:http://blogs.wankuma.com/myugaru/archive/2008/03/03/126036.aspx
そして今日で最終回(?)。
NyaRuRuさんのコメント:
なるほど.それであれば,コードの自動生成使いますかね.私なら. 
今だと partial クラス / partial メソッドが使えるので,かなり生成用のコードも楽になっています. 
 
以前書いたものですが,XSL を使って自動生成した C# コード. 
http://vsug.jp/tabid/63/forumid/45/threadid/6234/scope/posts/Default.aspx
http://www.dwahan.net/nyaruru/hatena/codegentest.xml
↑右クリック→「ソースの表示」をやってみてください. 
 
★コードをコードで生成(トランスレータ)というアイデアが素晴らしいです。
あれー何か最近こういう
話題の本を読んだような?w
私はまだまだこの領域へは到達できません。
 
かずきさんの回答:
http://blogs.wankuma.com/kazuki/archive/2008/03/05/126302.aspx
 
★これは上のNyaRuRuさんのやつの実践編ですね。ってかすぐ実践できちゃうって超人ですねえ。しかもRubyというのが超しびれます。
色々言語が使えてうらやましいです。(*´・ε・*)σ|| 
 
お二人ともありがとうございました。
 
最後に私が初日に考えた答えを出しておきます。
 
using System;
using System.Collections.Generic;
 
namespace Question1
{
 class ParentA
 {
  public List<ChildA> Children = new List<ChildA>();
  private static string whereStudy = "A家は塾に通う";
 
  public void Add(ChildA child)
  {
   Children.Add(child);
  }
 
  public void Cooking()
  {
   Console.WriteLine("ParentA:Cooking()");
  }
 
  public class ChildA
  {
   public void Study()
   {
    Console.WriteLine("ChildA:Study():" + whereStudy);
   }
  }
 }
 
 class ParentB
 {
  public List<ChildB> Children = new List<ChildB>();
  private static string whoTeach = "B家はパパが先生";
 
  public void Add(ChildB child)
  {
   Children.Add(child);
  }
 
  public void Cooking()
  {
   Console.WriteLine("ParentB:Cooking()");
  }
 
  public class ChildB
  {
   public void Study()
   {
    Console.WriteLine("ChildB:Study():" + whoTeach);
   }
  }
 }
}
 
namespace Answer1
{
 class ParentT<T> where T : ParentT<T>.ChildT
 {
  public List<T> Children = new List<T>();
 
  public void Add(T child)
  {
   Children.Add(child);
  }
 
  public virtual void Cooking()
  {
   Console.WriteLine("Cooking()");
  }
 
  public class ChildT
  {
   public virtual void Study()
   {
   }
  }
 }
 
 class ParentA : ParentT<ParentA.ChildA>
 {
  private static string whereStudy = "A家は塾に通う";
 
  public override void Cooking()
  {
   Console.Write("ParentA:");
   base.Cooking();
  }
 
  public class ChildA : ParentA.ChildT
  {
   public override void Study()
   {
    Console.WriteLine("ChildA:Study():" + whereStudy);
   }
  }
 }
 
 class ParentB : ParentT<ParentB.ChildB>
 {
  private static string whoTeach = "B家はパパが先生";
 
  public override void Cooking()
  {
   Console.Write("ParentB:");
   base.Cooking();
  }
 
  public class ChildB : ParentB.ChildT
  {
   public override void Study()
   {
    Console.WriteLine("ChildB:Study():" + whoTeach);
   }
  }
 }
}
 
namespace Console1
{
 //using Question1;
 using Answer1;
 
 static class Program
 {
  [STAThread]
  static void Main(string[] args)
  {
   Console.WriteLine("-- A --");
   ParentA pa = new ParentA();
   pa.Add(new ParentA.ChildA());
   pa.Add(new ParentA.ChildA());
   pa.Cooking();
   foreach (ParentA.ChildA c in pa.Children)
    c.Study();
 
   Console.WriteLine("-- B --");
   ParentB pb = new ParentB();
   pb.Add(new ParentB.ChildB());
   pb.Cooking();
   foreach (ParentB.ChildB c in pb.Children)
    c.Study();
 
   Console.ReadLine();
  }
 }
}