这是我的程序:
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));
}
}
我可以完成“同样的事情”——实际上不是完全相同的事情,但类似的事情会走两条不同的路线。
设计 1)我可以创建一个抽象类,强制该类的实现者如何 SayHi()
- 或者 -
设计 2)我可以创建一个类来定义一个 SayHi 属性,它是一个函数。(我称它为代表——但我不确定这是否是正确的术语)
设计 1 困扰着我,因为它可能导致类的泛滥
然而....
设计 2 让我感到困扰,因为当我必须让 Foo 实际上是 SayHi() 时,我觉得它是多余的。
felix.SayHi(felix)
我的问题是使用设计 1 或设计 2 是否更好——或者两者都不使用。当我说得更好时,我说的是在能够维护我的程序方面更实用。我在创建不同的类时遇到了这个问题,这些类将用于从不同的云 API(Google Drive、Box.com、DropBox)下载文件——起初我创建了单独的类,但后来我走了另一条路。