昨日の(http://blogs.wankuma.com/myugaru/archive/2008/03/03/126036.aspx)続きです。
問題は入れ子クラスの特性でございます。内部クラスから外部クラスのstatic変数へのアクセスができるのです。下のやつはそこらへんを強調してみました。昨日の状態と全く本質的には変えておりません。
あとGeneric使えねーとかおっしゃる人へ!w
ListのところをChild[]と配列に読み替えてください。
・・・ってか回答がたぶんGenericな感じになるので、どっちみち避けれませんぞ(笑
問題:以下のnamespace Question1内のコードをできるだけ冗長度の少ないコードへ書き直してください。指針としてnamespace Answer1なるものを用意しときました。
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 ParentA : ???
{
public class ChildA : ???
{
}
}
class ParentB : ???
{
public class ChildB : ???
{
}
}
}
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();
}
}
}
9:00 追記
要するに入れ子の子クラスの基底クラスを入れ子の状態を維持したまま作る問題です。今回は例えば利用者側の実装がすでに出来ている(上のmainみたいに)場合と考えてください。
以下は入れ子状態のままの基底クラスの想像図です。不完全です。
class ParentT
{
class ChildT
{
}
}
class ParentA : ParentT
{
class ChildA : ChildT
{
}
}