两类但同一个对象

时间:2019-03-29 13:58:27

标签: c# oop design-patterns

我有2个表,tblA和tblB,具有相同的字段和类型。我通过linq到sql获取数据,所以我有2个局部类clsTblA和clsTblB。

我有一个组合来选择tblA或tblB,我必须读该表并进行一些查询。

我想做的是鼓励重复代码以运行相同的方法。 所以现在我有了(用伪代码):

if (combo == "A")
{
  List<clsTblA> listUserNow = ctx.clsTblA.Where(p => p.blabla).ToList();
  List<clsTblA> listUserLastYear = ctx.clsTblA.Where(q => q.blabla).ToList();
}
if (combo == "B")
{
  List<clsTblB> listUserNow = ctx.clsTblB.Where(p => p.blabla).ToList();
  List<clsTblB> listUserLastYear = ctx.clsTblB.Where(q => q.blabla).ToList();
}

但是我想到了这样的东西(用伪代码):

SupClsTable clsTblX = null;
if (combo == A)
  clsTblX = new clsTblA();
if (combo == B)
  clsTblX = new clsTblB();

List<clsTblX> listUserNow = tblX.QueryForNow();
List<clsTblX> listUserLastYear = tblX.QueryForLastYear();

它存在这样的东西吗? 我还搜索了设计模式,但没有结果。

谢谢。

编辑1: 此时的代码如下:

if (combo == A)
{
  using (DbDataContext ctx = new DbDataContext())
  {
      List<clsTblA> listUserNow = ctx.clsTblA.Where(p => p.blabla).ToList();
      List<clsTblA> listUserLastYear = ctx.clsTblA.Where(q => q.blabla).ToList();
  }
}
if (combo == B)
{
  using (DbDataContext ctx = new DbDataContext())
  {
      List<clsTblB> listUserNow = ctx.clsTblB.Where(p => p.blabla).ToList();
      List<clsTblB> listUserLastYear = ctx.clsTblB.Where(q => q.blabla).ToList();
  }
}

所以我有两次listUserNow和listUserLastYear。 如何让我返回唯一的

using (DbDataContext ctx = new DbDataContext()) 
{
    List<*something*> listUserNow = ctx.*something*.Where(p => p.blabla).ToList();
    List<*something*> listUserLastYear = ctx.*something*.Where(p => p.blabla).ToList();
}

“ if combo”的从属? 提前致谢

3 个答案:

答案 0 :(得分:0)

似乎您正在寻找的是接口。即

interface ISampleInterface
{
    void SampleMethod();
}

class ImplementationClass : ISampleInterface
{
    // Explicit interface member implementation: 
    void ISampleInterface.SampleMethod()
    {
        // Method implementation.
    }
}

您可以在Microsoft文档站点Microsoft Docs

上了解更多相关信息。

编辑:进行澄清。一旦两个类都从接口失效,您可以编写以下

if (combo == A)
  clsTblX = new clsTblA();
if (combo == B)
  clsTblX = new clsTblB();

如下

IClsTable clsTbl = (combo == A)? new ClsTblA() : new ClsTblB() // example

并像以前使用clsTblClsTblA一样使用ClsTblB,因为两者都遵循相同的结构,并且具有相同的属性和方法。

也许this dotnetfiddle example可以帮助您理解此解决方案的概念。

答案 1 :(得分:0)

虽然我个人认为接口对于您的用例来说是更好的选择,但是您也可以实现类似这样的方法,以便于扩展。同样可以对接口进行强制转换。因此,每次添加新的组合时,只需添加一个案例,它就很容易扩展。

public class ComboFactory
{
    public static SuperCombo GetComboClassInstance(string comboCode)
    {
        switch(comboCode)
        {
            case "A":
                return new ComboA();
            case "B":
                return new ComboB();
            //and so on
        }
    }
}

答案 2 :(得分:0)

尝试看看这是否是您需要的:

public interface iTbl
{
    int Property1 { get; set; }
    string Property2 { get; set; }

    void WhatAreYou();
}

public class clsTblA : iTbl
{
    public int Property1 { get; set; }
    public string Property2 { get; set; }

    public void WhatAreYou()
    {
        Console.WriteLine("I am a clsTblA!");
    }
}

public class clsTblB : iTbl
{
    public int Property1 { get; set; }
    public string Property2 { get; set; }

    public void WhatAreYou()
    {
        Console.WriteLine("I am a clsTblB!");
    }
}

public class Program
{
    public static void Main()
    {
        List<iTbl> tbls = new List<iTbl>()
        {
            new clsTblA(),
            new clsTblB(),
            new clsTblB(),
            new clsTblA(),
            new clsTblA()
        };

        foreach (var tbl in tbls)
        {
            tbl.WhatAreYou();
        }
    }
}

输出:

I am a clsTblA!
I am a clsTblB!
I am a clsTblB!
I am a clsTblA!
I am a clsTblA!