代码之家  ›  专栏  ›  技术社区  ›  jaks

c#设计问题

c#
  •  3
  • jaks  · 技术社区  · 15 年前

    方法-1:

    class Report
    {
      ReportType type;
    }
    

    将ReportType子类划分为SalesType、ProfitType并将其分配给报表实例

    销售报告:

    Report sales = new Report();
    sales.type = new SalesType();
    

    ProfitReport公司:

    Report profit = new Report();
    profit.type = new ProfitType();
    

    方法2:

    class Report
    {
    }
    
    class SalesReport : Report
    {
    SalesType type;
    }
    
    class ProfitReport : Report
    {
    ProfitType type;
    }
    

    哪种方法最好?最好的设计呢?谢谢。

    class Report
    {
      ReportType type;
      Criteria criteria;
      Output output;
    }
    

    这些类被用作实体类。例如,从浏览器/客户机我们将得到xml <Report><Type>Sales</Type><Criteria>...</Criteria></Report>

    7 回复  |  直到 15 年前
        1
  •  2
  •   Andy_Vulhop    15 年前

    您是否打算以任何多态的方式将SalesReports和ProfitReports视为报表?

    销售报告和利润报告之间有多少共同的逻辑吗?

    Composition vs. Inheritance

    跳到“何时使用继承和何时使用组合?”第一部分。这是一篇基于Java的文章,但是这些概念对于静态OO语言来说是非常通用的。

        2
  •  1
  •   Icemanind    15 年前

    您应该创建一个接口:

    interface IReport {
        void RenderReport();
    }
    

    然后像这样编码:

    class SalesReport : IReport {
        void RenderReport()
        {
             // Do something here
        }
    }
    
    class ProfitReport : IReport {
        void RenderReport()
        {
             // Do something here
        }
    }
    

    IReport report;
    report = new ProfitReport();
    report.RenderReport();
    report = new SalesReport();
    report.RenderReport();
    
        3
  •  0
  •   leppie    15 年前

    作为 SalesType ProfitType 已经从 ReportType 我会说,接近1。

        4
  •  0
  •   veljkoz Danko Valkov    15 年前

    方法2会更好,因为您可以重用与所有报表(打印、重新评估等)相似的代码。而且不需要里面的“SalesType”,因为您已经在子类化。。。

    这也被称为 template pattern “在设计模式术语中。

        5
  •  0
  •   Caimen    15 年前

    如果说您的销售报告将拥有与报表相同的所有属性,那么从这样的基类派生它们是最好的方法。然而,如果从一种类型的报告到另一种类型的报告会有极端的差异,那么我会走另一条路。

    基本上,我在report类中看到的是名称和地址之类的东西。然后,报表的实际统计信息或数据将存储在SalesReport类中。这取决于你需要什么。重要的是要考虑等级制度。哪些数据对所有报表都很重要?什么数据是特定于某种类型的报告的?回答这些问题,你就会得到答案。

        6
  •  0
  •   KeithS    15 年前

    如果这两个报告非常相似,那么大部分代码都应该在基类报告中结束,派生类型提供特定的实现细节。

        7
  •  0
  •   P Daddy    15 年前

    什么是 ReportType , SalesType ProfitType 上课?用“Type”结束类名是不好的,除非它们标识了其他类型。在这种情况下,枚举几乎总是您想要的:

    enum ReportType{
        Sales,
        Profit,
        // ...
    }
    

    但是,如果使用方法2(在这种情况下,这通常是最佳选择),您实际上不需要属性来标识报告类型,因为您可以为此目的使用类型标识。

    换句话说,不要这样做:

    void DoSomethingWithReport(Report r){
        if(r == null)
            throw new ArgumentNullException();
    
        switch(r.Type){
        case ReportType.Sales:
            ((SalesReport)r).DoSomething();
            break;
        case ReportType.Profit:
            ((ProfitReport)r).DoSomethingElse();
            break;            
        }
    }
    

    相反,可以这样做:

    void DoSomethingWithReport(Report r){
        if(r == null)
            throw new ArgumentNullException();
    
        SalesReport sr = r as SalesReport;
        if(sr != null){
            sr.DoSomething();
            return;
        }
    
        ProfitReport pr = r as ProfitReport;
        if(pr != null);
            pr.DoSomethingElse();
    }
    

    更好的是,使用多态性:

    abstract class Report{
        public abstract void DoGeneralThing();
    }
    
    class SalesReport : Report{
        public override void DoGeneralThing(){
            /*Perform the old duties of SalesReport.DoSomething*/
        }
    }
    
    class ProfitReport : Report{
        public override void DoGeneralThing(){
            /*Perform the old duties of ProfitReport.DoSomethingElse*/
        }
    }
    
    void DoSomethingWithReport(Report r){
        r.DoSomething();
    }