这种oop模式的优点和缺点有什么区别?

时间:2010-07-31 10:00:13

标签: language-agnostic oop

我写了一些关于oop模式的代码。但我无法清楚地看到这两种使用优势的劣势:

第一:


     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...");
        }
    }

第一个和第二个有什么区别?我更喜欢哪一个?我可以使用其中一种产品吗?两种用法之间有什么优点或不同之处?

3 个答案:

答案 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)

我认为两者没有任何区别。

如果您想要发送并忘记报告,请使用第一个报告。如果要保留报表对象以进行其他调用,请将其缓存在数组中,如第二种情况。真的没什么区别。