2012-05-29 67 views
0

我在项目中有很多类都需要具有相同构造函数和1个公共方法的基本集合。下面是这个分部类的一个示例:使用相同方法的多个类

public partial class SHIPMENT_LINE 
{ 
    private OracleConnection _rp = null; 
    private EntityConnection _rpe = null; 
    private static string _schema = ""; 

    public SHIPMENT_LINE() { } 

    public SHIPMENT_LINE(BHLibrary.Configuration.ConnectionOption Environment) 
    { 
     SetConnection(Environment); 
    } 

    public void SetConnection(BHLibrary.Configuration.ConnectionOption Environment) 
    { 
     this._rp = Configuration.RPConnection(Environment); 
     this._rpe = Configuration.RPEntityConnection(Environment, out _schema); 
    } 
} 

我需要实现相同的私有变量,构造,并在每个我的课,我创建的SetConnection方法。在所有课程都存在之后,每个班级都会做不同的事情,所以班级并不一定都是相关的,除了他们都具有相同的“开始”这一事实。

我应该如何构建这些类中的每一个,以便我不必在每个创建的类中实现SetConnection方法?

请记住这一点:

  • 由于其他限制,我无法从这些类的另一个类继承。然而,如果需要,我可以使用接口可以
+0

看来你回答了你自己的问题,有什么问题简单地实现一个接口? –

+1

接口不能用于指定私有变量。继承正是你在这种情况下要做的。我不知道为什么会受到限制。这也令人困惑,为什么你会关心私有变量。 – stephenbayer

+0

@stephenbayer我实际上从来没有意识到,谢谢你的修正 –

回答

2

我建议去为成分,而不是继承...

使每个类实现一个接口,然后让另一个类(不涉及这些),这也实现了接口,并有具体实施它。上面提到的所有类都应该有一个这个额外类的实例,只需调用它即可。

public partial class SHIPMENT_LINE : ISetConnection 
{ 
    private ConnectionSetter connector = new ConnectionSetter(); 

    public void SetConnection(BHLibrary.Configuration.ConnectionOption Environment) 
    { 
     this.connector.SetConnection(Environment); 
    } 
} 

public class ConnectionSetter : ISetConnection 
{ 
    public void SetConnection(BHLibrary.Configuration.ConnectionOption Environment) 
    { 
     // Implementation 
    } 
} 
+0

我喜欢这里要去的地方,但有一个问题: 请注意,Shipment_Line类中最初的'SetConnection'方法是用'this '关键字。如果我创建了实现“ISetConnection”接口的'ConnectionSetter'类,如何获得'ConnectionSetter'类中的'SetConnection'方法来设置'Shipment_Line'类中的私有变量? – jaressloo

+1

@jaressloo:首先,如果可能的话,我建议将它们移动到ConnectionSetter(这将是我的偏好,试图分开疑虑 - 为什么装运行应知道如何处理连接?)。理解有时候你有这些限制,但是你可以添加一个额外的接口,它具有'OracleConnection'并将'this'传递到ConnectionSetter构造函数中,然后将这些成员放入内部或通过属性公开,并在调用SetConnection时修改它们。 – Ian

1

如果你不能创建一个将实现你的通用功能(基于任何原因?)的基类,那么你可能会使用T4模板来用你的常用方法生成部分类。

2

如果你不能继承子类,那么抽象类不是一个可行的解决方案,接口只会给你你的公共类没有任何实现的契约。

我会建议在一个普通的类中实现通用的功能,并将其用作其他类中的私有成员(I.E.组合而不是继承)。您的其他类都可以实现一个接口,以确保它们都具有相同的方法,并且可以将它们的调用转发到方法的私有类实现。

E.G.

private MYClassWithCommonFunctionality xyz = new MYClassWithCommonFunctionality(); 

然后......

Private void MyCommonInterfaceMethod(object param) 
{ 
    // Do derived class specific stuff here... 
    xyz.MyCommonInterfaceMethod(param); 
} 

而作为一个额外的好处,有点超前意识的....有共同的阶级也有着相同的接口,并通过这方面的一个实施成你的其他类构造函数。这种方式在未来可以交换实现另一个。

相关问题