Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OOP-将两个表合并到同一个对象中_C#_Oop - Fatal编程技术网

C# OOP-将两个表合并到同一个对象中

C# OOP-将两个表合并到同一个对象中,c#,oop,C#,Oop,我在数据库中有两个表,它们几乎用于相同的事情,但是这些表的结构并不完全相同 假设我有一个表用于手动请求,另一个表用于自动请求。我必须将两个表加载到同一个GridView中,并且使用自定义业务对象 为了说明这个问题,我将TManualReqTable和TAutomaticReqTable称为TManualReqTable TManualReqTable - ID - Field1 - Field2 - Field3 - Field4 及 在代码中,我对这两个表使用相同的对象。我有一个包含两个表

我在数据库中有两个表,它们几乎用于相同的事情,但是这些表的结构并不完全相同

假设我有一个表用于手动请求,另一个表用于自动请求。我必须将两个表加载到同一个GridView中,并且使用自定义业务对象

为了说明这个问题,我将TManualReqTable和TAutomaticReqTable称为TManualReqTable

TManualReqTable 
- ID
- Field1
- Field2
- Field3
- Field4

在代码中,我对这两个表使用相同的对象。我有一个包含两个表的所有属性的接口,并且在将数据加载到对象时检查字段是否存在

但我认为这应该用两个对象和一个带有抽象方法的超类来创建


您对此有何看法?

我遵循一条避免创建基类的一般规则,除非:

  • 我已经设计或发现了足够的通用性,为基类提供了足够的内容

  • 我有一个使用类作为基类的用例;如果我没有任何东西可以对类的公共功能进行操作,那么拥有一个基类就没有什么价值(可以通过组合一个实现公共行为的类来实现相同的功能)

  • 这些需求足够稳定,我相信基类抽象在未来不会有重大修改。随着时间的推移,基类变得越来越难以修改


  • 我遵循一般规则避免创建基类,除非:

  • 我已经设计或发现了足够的通用性,为基类提供了足够的内容

  • 我有一个使用类作为基类的用例;如果我没有任何东西可以对类的公共功能进行操作,那么拥有一个基类就没有什么价值(可以通过组合一个实现公共行为的类来实现相同的功能)

  • 这些需求足够稳定,我相信基类抽象在未来不会有重大修改。随着时间的推移,基类变得越来越难以修改


  • 我将创建一个接口
    IRequest
    ,该接口描述了这两者通用的字段和方法,然后为实现
    IRequest
    ManualRequest
    AutomaticRequest
    创建接口和类,并添加它们各自特有的方法/字段

    您可以使用
    IRequest
    作为包含其中任一项的内容的类型。在遍历可能包含其中任何一个对象的数据时,可以检查每个对象是否实现了接口:

    foreach (IRequest obj in RequestList) {
      // do stuff that uses the common interface
    
      if (obj is IManualRequest) {
         // do stuff specific to manual requests
      } else if (obj is IAutomaticRequest) {
         // likewise
      }
    }
    

    我将创建一个接口
    IRequest
    ,该接口描述了这两者通用的字段和方法,然后为实现
    IRequest
    ManualRequest
    AutomaticRequest
    创建接口和类,并添加它们各自特有的方法/字段

    您可以使用
    IRequest
    作为包含其中任一项的内容的类型。在遍历可能包含其中任何一个对象的数据时,可以检查每个对象是否实现了接口:

    foreach (IRequest obj in RequestList) {
      // do stuff that uses the common interface
    
      if (obj is IManualRequest) {
         // do stuff specific to manual requests
      } else if (obj is IAutomaticRequest) {
         // likewise
      }
    }
    

    在我看来,先别管数据库是什么样子了

  • 想一想它应该如何作为一个对象进行结构化
  • 想想你想如何使用该对象。如果您需要可视化,请编写一些尚未存在的对象的代码,并对其进行调整,直到它看起来优雅
  • 想一想如何让它发生

  • 希望能有所帮助。

    在我看来,先别管数据库是什么样子的

  • 想一想它应该如何作为一个对象进行结构化
  • 想想你想如何使用该对象。如果您需要可视化,请编写一些尚未存在的对象的代码,并对其进行调整,直到它看起来优雅
  • 想一想如何让它发生

  • 希望能有所帮助。

    好吧,我在这里做了一些假设,让我把它们说清楚

    鉴于:

  • 这主要是查询/显示逻辑的差异
  • 显示逻辑已经可以处理空值
  • 所表示的基础对象在这两个项之间是相同的
  • 有一种简单的方法可以确定这是“手动”还是“自动”呼叫
  • 我要说的是,继承不是我建模的方式。为什么?因为它是同一个物体,不是两种不同的物体。您基本上只是不显示几个字段,所以不需要查询它们

    因此,我可能会尝试完成一些事情,明确两者之间的区别(请记住,我的目的是展示一种组织方式,以便清楚地看到,任何特定的实现都可能有不同的需求;收集的主要思想是将差异视为它们是什么:根据某种条件查询的内容的差异

    public enum EQueryMode
    {
        Manual,
        Automatic
    }
    
    public class FieldSpecification
    {
        public string FieldName { get; set; }
        public bool[] QueryInMode { get; set; }
    
        public FieldSpecification
            (
                string parFieldName, 
                bool parQueryInManual, 
                bool parQueryInAutomatic
            )
        {
            FieldName = parFieldName;
            QueryInMode = new bool[] { parQueryInManual, parQueryInAutomatic };
        }
    }
    
    public class SomeKindOfRecord
    {
        public List<FieldSpecification> FieldInfo =
            new List<FieldSpecification>()
                {
                    new FieldSpecification("Field1",  true, true),
                    new FieldSpecification("Field2",  true, false),
                    new FieldSpecification("Field3",  true, true),
                    new FieldSpecification("Field4",  true, false)
                };
    
        // ...
    
        public void PerformQuery(EQueryMode QueryMode)
        {
            List<string> FieldsToSelect =
                (
                    from f
                        in FieldInfo
                    where
                        f.QueryInMode[(int)QueryMode]
                    select
                        f.FieldName
                )
                .ToList();
    
            Fetch(FieldsToSelect);
        }
    
        private void Fetch(List<string> Fields)
        {
            // SQL (or whatever) here
        }
    }
    
    public enum equalymode
    {
    手册
    自动的
    }
    公共类字段规范
    {
    公共字符串字段名{get;set;}
    公共bool[]查询模式{get;set;}
    公共字段规范
    (
    字符串parFieldName,
    布尔公园手册,
    布尔帕尔克酒店
    )
    {
    FieldName=parFieldName;
    QueryInMode=new bool[]{parQueryInManual,parQueryInAutomatic};
    }
    }
    公共类记录
    {
    公共列表字段信息=
    新名单()
    {
    新的现场规范(“现场1”,正确,正确),
    新的现场规范(“现场2”,正确,错误),
    新的现场规范(“现场3”,正确,正确),
    新的现场规范(“现场4”,对,错)
    };