OOP - 将两个表放入同一个对象中

时间:2011-07-11 14:52:30

标签: c# oop

我在数据库中有两个表几乎用于相同的表,但表没有完全相同的结构。

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

为了说明我将称之为TManualReqTable和TAutomaticReqTable的问题。

TManualReqTable 
- ID
- Field1
- Field2
- Field3
- Field4

TAutomaticReqTable
- ID
- Field1
- Field3

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

但我认为应该使用两个对象和一个带有摘要方法的超类来创建。

您对此有何看法?

4 个答案:

答案 0 :(得分:4)

我会创建一个界面IRequest来描述字段&两种方法共有的方法,然后是接口&实现ManualRequest的{​​{1}}和AutomaticRequest的类,并添加每个类的唯一方法/字段。

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

IRequest

答案 1 :(得分:2)

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

  1. 我已经设计或发现了足够的共性,为基类提供足够的实质内容。

  2. 我有一个用例来消耗类作为基类;如果我没有任何可以对类的通用功能进行操作的东西,那么拥有基类(通过实现常见行为的类的组合可以实现相同的功能)几乎没有价值。

  3. 要求足够稳定,我相信基类抽象将在未经重大修改的情况下保留。随着时间的推移,基类越来越难以修改。

答案 2 :(得分:2)

IMO,忘记数据库在一两分钟内的样子。

  1. 想一想它应该如何结构化作为一个对象。
  2. 想想您希望使用该对象的方式。如果您需要可视化,请编写一些尚未存在的对象的代码并进行调整,直到它看起来很优雅。
  3. 想想如何来实现它。
  4. model first development

    希望它有所帮助。

答案 3 :(得分:0)

嗯,我在这里做了一些假设,所以让我明白一下......

下式给出:

  1. 这主要是查询/显示逻辑的差异
  2. 显示逻辑已经可以处理空值
  3. 表示的基础对象在两个项目之间是相同的
  4. 有一种简单的方法可以确定这是“手动”还是“自动”通话
  5. 我会说继承不是我建模的方式。为什么?因为它是同一个对象,而不是两种不同的对象。你基本上只是没有显示几个字段,因此不需要查询它们。

    所以,我可能会尝试完成一些能够明确两者之间差异性质的东西(请记住,我打算这样做以显示组织它的方式,以便明确,任何特定的实现可能有不同的需求;收集的主要思想是将差异视为它们的基础:根据某种条件查询的差异。

    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
        }
    }
    

    编辑:哇我今天似乎无法发表文章而不必更正我的语法! ;)