NOTE: この記事は、当初、ココログの「いげ太のブログ」で公開していたものです。
Ruby の Mix-in がステキそうなのは動的言語だからなのかな。どうも、C# で有用な Mix-in ってなんだろうって考えると、結局、多重継承みたくなっちゃうんだけども。んー、とりあえず書いてみるべか。
というわけでコード、ダイヤモンド継承。お楽しみに~。
/*
* [EatingMixin]
* △
* │
* ┌───┴───┐
* │ │
* [FoodMixin] [BeverageMixin]
* △ △
* │ │
* └───┬───┘
* │
* [Curry]
*/
public interface EatingMixin
{
string Name { get; }
}
public static class EatingExtensions
{
public static string Eat(this EatingMixin self)
{
return self.Name + "(゚Д゚)ウマー";
}
}
public interface FoodMixin : EatingMixin
{
}
public static class FoodExtensions
{
public static string GetFoodInfo(this FoodMixin self)
{
return self.Name + "は食べ物!";
}
}
public interface BeverageMixin : EatingMixin
{
}
public static class BeverageExtensions
{
public static string GetBeverageInfo(this BeverageMixin self)
{
return self.Name + "は飲み物!";
}
}
public class Curry : FoodMixin, BeverageMixin
{
public string Name
{
get { return "カレー"; }
}
}
class Program
{
static void Main(string[] args)
{
var curry = new Curry();
Console.WriteLine(curry.Eat()); //カレー(゚Д゚)ウマー
Console.WriteLine(curry.GetFoodInfo()); //カレーは食べ物!
Console.WriteLine(curry.GetBeverageInfo()); //カレーは飲み物!
}
}
はい。ためになったね~。これ。ためになったよ~。というわけで、みなさま賛否両論あったと思いますが、ここまででネタ終わりでございます。(©もう中学生)
関連記事
- C# 3.0 で拡張メソッドによる Mix-in 的ななにか (2008/05/16)