class Program
{
static void Main(string[] args)
{
Report rp = new Report();
rp.MakeReport();
rp = new ExcelReport();
rp.MakeReport();
rp = new PdfReport();
rp.MakeReport();
rp = new WordReport();
rp.MakeReport();
Console.ReadKey();
}
}
class Program
{
static void Main(string[] args)
{
Report[] rp = new Report[4];
rp[0] = new Report();
rp[1] = new ExcelReport();
rp[2] = new PdfReport();
rp[3] = new WordReport();
rp[0].MakeReport();
rp[1].MakeReport();
rp[2].MakeReport();
rp[3].MakeReport();
Console.ReadKey();
}
}
class Report
{
public virtual void MakeReport()
{
Console.WriteLine("Simple Report preparing...");
System.Threading.Thread.Sleep(2000);
Console.WriteLine("Simple Report prepared...");
}
}
class ExcelReport : Report
{
public override void MakeReport()
{
Console.WriteLine("Excel Report preparing...");
System.Threading.Thread.Sleep(2000);
Console.WriteLine("Excel Report prepared...");
}
}
class PdfReport : Report
{
public override void MakeReport()
{
Console.WriteLine("Pdf Report preparing...");
System.Threading.Thread.Sleep(2000);
Console.WriteLine("Pdf Report prepared...");
}
}
class WordReport : Report
{
public override void MakeReport()
{
Console.WriteLine("Word Report preparing...");
System.Threading.Thread.Sleep(2000);
Console.WriteLine("Word Report prepared...");
}
}
第一个和第二个有什么区别?我更喜欢哪一个?我可以使用其中一种产品吗?两种用法之间有什么优点或不同之处?
答案 0 :(得分:2)
第二个缺点是显式索引难以维护(稍后返回并修改),甚至难以复制 - 粘贴 - 修改。输入错误很难找到,也不会产生编译错误。
您可能需要考虑进行更常见的多态实践,而不是其中任何一种:迭代基类型的列表/数组。这样做的一大优点是代码可以格式化为非常简短,易于阅读。
class Program
{
static void Main(string[] args)
{
Report[] reports = new Report[]
{
new Report(),
new ExcelReport(),
new PdfReport(),
new WordReport(),
};
foreach(Report report in reports)
report.MakeReport();
Console.ReadKey();
}
}
此外,在许多情况下,集合类比数组更灵活/方便。例如,您可以稍后将新值添加到List< Report>:
class Program
{
static void Main(string[] args)
{
List<Report> reports = new List<Report>()
{
new Report(),
new ExcelReport(),
new PdfReport(),
new WordReport(),
};
foreach(Report report in reports)
report.MakeReport();
report.Add(new ExcelReport());
foreach(Report report in reports)
report.MakeReport();
Console.ReadKey();
}
}
答案 1 :(得分:1)
如果您不想保留对报表对象的引用,可以执行以下操作:
class Program
{
static void Main(string[] args)
{
new Report().MakeReport();
new ExcelReport().MakeReport();
new PdfReport().MakeReport();
new WordReport().MakeReport();
Console.ReadKey();
}
}
答案 2 :(得分:0)
我认为两者没有任何区别。
如果您想要发送并忘记报告,请使用第一个报告。如果要保留报表对象以进行其他调用,请将其缓存在数组中,如第二种情况。真的没什么区别。