前回は、C++で解答の条件を満たしてなかった。
でも、出題されてるエントリを見てると自動生成で実世界での用件を満たせそうだ。
XSLを使ってかかれてたので、Rubyを使って書いてみた。
require 'erb'
require 'yaml'
yaml_data = <<YAML
- {name: ParentA, child_name: ChildA, message: A家は塾に通う}
- {name: ParentB, child_name: ChildB, message: B家はパパが先生}
YAML
template = ERB.new <<TEMPLATE, nil, "-"
namespace Answer1
{
<%- src.each do |clazz| -%>
class <%=clazz["name"]%>
{
public List<<%=clazz["child_name"]%>> Children = new List<<%=clazz["child_name"]%>>();
private static string whereStudy = "<%=clazz["message"]%>";
public void Add(<%=clazz["child_name"]%> child)
{
Children.Add(child);
}
public void Cooking()
{
Console.WriteLine("<%=clazz["name"]%>:Cooking()");
}
public class <%=clazz["child_name"]%>
{
public void Study()
{
Console.WriteLine("<%=clazz["message"]%>:Study():" + whereStudy);
}
}
}
<%- end -%>
}
TEMPLATE
src = YAML::load(yaml_data)
template.run binding
YAMLで自動生成するクラスのメタデータ?を定義してERBでさくっと生成してみる。
実行すると下のようになって、たぶんもとのMainを書き換えなくても動くかなぁ…?
namespace Answer1
{
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("A家は塾に通う:Study():" + whereStudy);
}
}
}
class ParentB
{
public List<ChildB> Children = new List<ChildB>();
private static string whereStudy = "B家はパパが先生";
public void Add(ChildB child)
{
Children.Add(child);
}
public void Cooking()
{
Console.WriteLine("ParentB:Cooking()");
}
public class ChildB
{
public void Study()
{
Console.WriteLine("B家はパパが先生:Study():" + whereStudy);
}
}
}
}