2010-09-03 82 views
0

我是使用OOP进行编程的新手,我试图正确使用继承的概念。对不同类型的变量使用继承方法

这里是这里的代码是什么我想(Link Here

public class Base 
{ 
    //Type? 
    public abstract static object Adapter();    

    public static DataTable GetWOCost(DateTime Date, string WO) 
    { 
     Application.UseWaitCursor = true; 
     DataTable dt = new DataTable(); 

     try 
     { 
      //Cast? 
      dt = Adapter().GetDataByWO(WO, Date); 
      Application.UseWaitCursor = false; 
      return dt; 

     } catch (Exception) 
     { 
      return null; 
     } 
    } 
} 

public class Materiel : Base 
    { 
     static AllieesDBTableAdapters.CoutMatTableAdapter Adapter() 
     { 
      return new AllieesDBTableAdapters.CoutMatTableAdapter();   
     } 
    } 

    public class Labor : Base 
    { 
     static AllieesDBTableAdapters.CoutLaborTableAdapter Adapter() 
     { 
      return new AllieesDBTableAdapters.CoutLaborTableAdapter(); 
     } 
    } 

起初,我所有的代码是在材料类。但是,我不得不添加第二个相同的类,而是添加了不同的SQL适配器。我尝试了不同的事情,但上面的代码有一个很大的问题。

由于类型正在改变我使用的对象,但它不会没有强制转换。但是因为我不知道它是什么类型,所以有两个或更多具有GetWOCost方法的类,但使用不同的适配器的正确方法是什么?

也许我应该更改为.NET 4.0并使用动态对象?

编辑:此外似乎有抽象和静态的问题,所以我不能在我的方法GetWOCost()没有一个Adapter()(在基类中)的实例上使用静态修改器。似乎只是复制粘贴会更容易,但我正试图找出正确的方法来做到这一点。

+0

您绝对不应该为此任务使用动态。这不是它的设计目的。 – driis 2010-09-03 17:25:10

回答

2

你应该在这种情况下做的,就是对程序的接口,它定义合同的您要使用适配器对象做什么。如果您的实现类不共享通用接口,则可以为它们创建一个接口。

然后你可以创建这个接口的不同实现;并在每个子类中重写适配器方法以返回正确的接口实现。

你应该摆脱你的静态方法,因为多态类型的整体思想是,你可以得到不同的实例,但以不同的方式做同样的事情。

在代码中,这可能看起来像这样(简化):

public interface IAdapter 
{ 
    DataTable GetWOCost(); // Implementors must have a method with this signature 
} 

public class Base 
{ 
    public abstract IAdapter Adapter(); 

    // Methods that use IAdapter instances here. 
} 

class Materiel : Base 
{ 
    public override IAdapter Adapter() { return new CoutMatTableAdapter(); } 
} 

class Labor : Base 
{ 
    public override IAdapter Adapter() { return new CoutLaborTableAdapter(); } 
} 

然后你只需要在你的不同适配器实现新的接口,如:

public class CoutLaborTableAdapter : IAdapter 
{ 
    public DataTable GetWOCost() { /* implementation */ } 
} 
+0

我确实想过使用接口,只是不确定。 问题是: - 我使用数据集设计器来创建我的表适配器,所以当我更新某些东西时,更改任何东西可能会被破坏。我也有其他用途的查询(在同一个表中) - 你也可以更具体地了解GetWOCost和GetDataByWO(GetWOCost是我调用的方法获取数据,GetDataByWO是我的SQL查询 - 我会放松我的静态方法(不是那么重要) – Nigol 2010-09-03 17:49:10

0

OK我做让你的解决方案工作,GetDataByWO GetWOCost有一点点混乱。你没有使用正确的。

public interface IAdapter 
{ 
    DataTable GetDataByWO(string WO, DateTime Date); 
} 

public abstract class Base 
{ 
    public abstract IAdapter Adapter(); 

    public DataTable GetWOCost(DateTime Date, string WO) 
    { 
     Application.UseWaitCursor = true; 
     DataTable dt = new DataTable(); 

     try 
     { 
      dt = Adapter().GetDataByWO(WO, Date); 
      Application.UseWaitCursor = false; 
      return dt; 

     } catch (Exception) 
     { 
      return null; 
     } 
    } 
} 

public class Materiel : Base 
{ 
    public override IAdapter Adapter() 
    { 
     return new CoutMatTableAdapter();   
    } 
} 

public class Labor : Base 
{ 
    public override IAdapter Adapter() 
    { 
     return new CoutLaborTableAdapter(); 
    } 
} 

public class CoutMatTableAdapter: IAdapter 
{ 
    public DataTable GetDataByWO(string WO, DateTime Date) 
    { 
     AllieesDBTableAdapters.CoutMatTableAdapter adpt = new AllieesDBTableAdapters.CoutMatTableAdapter(); 
     return adpt.GetDataByWO(WO, Date); 
    } 
} 

public class CoutLaborTableAdapter : IAdapter 
{ 
    public DataTable GetDataByWO(string WO, DateTime Date) 
    { 
     AllieesDBTableAdapters.CoutLaborTableAdapter adpt = new AllieesDBTableAdapters.CoutLaborTableAdapter(); 
     return adpt.GetDataByWO(WO, Date); 
    } 
} 

现在来找出为什么劳动力类抛出一个异常(SQL部分生成)。所以看起来抽象和静态不能很好地结合在一起(我可以理解为什么,但如果我的方法是静态的,这将是非常好的)