これが私のプログラムです:
class Program
{
//DESIGN 1
abstract class AFoo
{
public string Bar { get; set; }
public abstract string SayHi();
}
class LoudFoo : AFoo
{
public override string SayHi()
{
return this.Bar.ToUpper();
}
}
class QuietFoo : AFoo
{
public override string SayHi() { return this.Bar.ToLower(); }
}
//DESIGN 2
class Foo{
public string Bar { get; set; }
public Func<Foo, string> SayHi { get; set; }
}
static void Main(string[] args)
{
//USING DESIGN 1
var quietFoo2 = new QuietFoo{ Bar = "Mariane"};
var loudFoo2 = new LoudFoo{ Bar = "Ginger"};
Console.WriteLine(quietFoo2.SayHi());
Console.WriteLine(loudFoo2.SayHi());
//USING DESIGN 2
var quietFoo = new Foo
{
Bar = "Felix",
SayHi = (f) => { return f.Bar.ToLower(); }
};
var loudFoo = new Foo
{
Bar = "Oscar",
SayHi = (f) => { return f.Bar.ToUpper(); }
};
Console.WriteLine(quietFoo.SayHi(quietFoo));
Console.WriteLine(loudFoo.SayHi(loudFoo));
}
}
私は「同じこと」を達成できます。実際にはまったく同じことではありませんが、似たようなことを 2 つの異なるルートで行うことができます。
設計 1)そのクラスの実装者に SayHi() の方法を強制する抽象クラスを作成できます
- また -
設計 2)関数である SayHi プロパティを定義するクラスを作成できます。(私はそれをデリゲートと呼んでいますが、ここでの正しい用語かどうかはわかりません)
設計 1 は、クラスの急増につながる可能性があるため、気になります
まだ....
設計 2 は、Foo を実際に SayHi() にする必要がある場合に冗長に感じられるため、気になります。
felix.SayHi(felix)
私の質問は、デザイン 1 とデザイン 2 のどちらを使用する方が良いか、あるいはどちらも使用しない方が良いかということです。私がより良いと言うとき、私は自分のプログラムを維持できるという点でどちらがより実用的であるかを言っています. さまざまなクラウド API (Google Drive、Box.com、DropBox) からファイルをダウンロードするために使用されるさまざまなクラスを作成したときに、これに遭遇しました。最初は別々のクラスを作成しましたが、別のルートに行きました。