如何决定何时使用继承或仅使用基类的功能

时间:2017-04-12 05:03:05

标签: c# oop inheritance

我对OOP中的继承概念有一些疑问。当我刚刚完成自定义类的编码以连接数据库时  例如

   `// for encapsulate some method under and use as the team's custom 
    // version of DBconnect
   public class DBconnector()
   {
      public void SetConnection(); // setting 
      public void BeginCon(); // setting 
      public void SetQuery(String i_Query , CommandType cmdType); // setting 
      public Object GetExcetue();
     ... // other setting 
   }` 

然后系统具有单独的业务逻辑,它将获取其模块的内容(来自数据库的数据),如BusinessLogicM1,BusinessLogicM2,BusinessLogicM3 ......    这些单独的类将通过使用DBconnector的功能从Db获取数据。所以我在这里很困惑我是否应该通过继承DBconnector类来编写BusinessLogic类,只使用DBconnector的方法。
       public class BusinessLogicX :DBconnector { public Object GetXData() { ...// setting return this.GetExcetue(); } }          或
       public class BusinessLogicX { public Object GetXData() { var service = new DBconnector(); ...//setting return service.GetExcetue(); } }

2 个答案:

答案 0 :(得分:1)

应该根据类的预期功能来驱动继承。在您的情况下,DBConnector类的功能是管理数据库连接/查询,而BusinessLogicX类的功能是实现业务逻辑。因此这两个类没有关联,因此不应该有继承。 我建议你可以只使用DBConnector类的方法。

在BusinessLogic实现中,如果BusinessLogicM1,BusinessLogicM2 ..共享任何常见行为,那么您应该将继承构建为

class BaseBusinessLogic
{
    public void commonMethod1() 
    {
    }
    public void commonMethod2() 
    {
    }

    public Object GetXData()
    { 
            var service = new DBconnector();
            ...//setting
            return service.GetExcetue();
    }
}


Class BusinessLogicM1 : BaseBusinessLogic
{
      public void M1LogicMethod()
      {
          ..........
      }
}

您还可以考虑将DBConnector作为BaseBusinessLog类的成员,从而维护数据库连接可以在一个地方。

...将DBConnector作为成员的BaseBusinessLogic类示例

class BaseBusinessLogic
{

    private DBconnector _connector;

    public void initConnector( DBConnector iConnector)
    {
        this._connector =  iConnector;
    }

    public void commonMethod1() 
    {
    }
    public void commonMethod2() 
    {
    }

    public Object GetXData()
   { 

            ...//setting
            _connector.SetQuery("..."); // Query to get 'X' Data
            return _connector.GetExcetue();
    }
}


Class BusinessLogicM1 : BaseBusinessLogic
{
      public void M1LogicMethod()
      {
          // Fetch DataList from DBConnector
          _connector.SetQuery(".....");
          Object obj = _connector.GetExecute();

          Object xData = GetXData();

          // use obj and xData Object to build BusinessLogicM1
      }
}

答案 1 :(得分:0)

  

如果BusinessLogicX类有意查询其模块的数据   DB,这并不意味着BusinessLogicX类具有相同的功能   DBConnector的功能(它可以连接到数据库)?

没有。这是不正确的,BL(业务逻辑)和DB(存储)之间的继承是不可能的。

分离关注

您的业务类只需要数据,不应该关心检索它的机制。事实上,它甚至不知道是从MSSQL,Oracle还是仅仅是基于文件的数据源检索数据。这是数据访问层或类的头痛问题。当你去咖啡馆时,对你来说最重要的是你订购的一杯咖啡,而不是他们如何准备它!

正如@milindmb正确指出的那样,如果适用,你应该在基本BL中放置常见行为。您可以将基本BL标记为abstract而不是具体。

<强> DbConnector

我建议为此定义interface并将其作为依赖项注入BL类中。请注意,接口对于依赖项注入不是必需的。你可以注入类类型,也可以在@milinmb的基础BL类中显示。接口具有以下优点:如果/当您对业务逻辑类进行单元测试时,可以模拟它们。那是另一个故事。所以通常你的商务舱看起来像下面(我喜欢称之为服务。这是你的选择):

public abstract class ServiceBase {
    protected readonly IDbConnector dbConnector;

    public ServiceBase(IDbConnector dbConnector) {
        this.dbConnector = dbConnector;
    }
}

public class UserService : ServiceBase {
    public UserService(IDbConnector dbConnector) : base(dbConnector) {
    }

    // use dbConnector from ServiceBase 
}

拥有IDBConnector将意味着,将来你将能够在你正在使用的数据源上注入它的不同实现基础,例如:SqlConnector,OracleConnector等。上面显示了构造函数注入,这是一个类型依赖注入(DI)。还有方法和设置器(使用属性)注入。因为有时依赖项是可选的,您可能希望创建类实例而不注入它们。了解有关DI的更多信息。

<强>存储库

这将超出范围,所以我留给你学习。检查Google是否使用构成应用程序数据访问层的存储库。它们的使用取决于您的应用范围。