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



我对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(); } }

继承应根据类的预期功能来驱动。在您的情况下,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
}
}

如果BusinessLogicX类打算从 DB,不是说BusinessLogicX类具有相同的吗? DBConnector 的功能(它可以连接到数据库) ?

不。这是不正确的,BL(业务逻辑)和DB(存储)之间的继承是毫无疑问的。

关注点分离

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

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

数据库连接器

我建议为此定义一个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 是否使用了构成应用程序数据访问层的存储库。它们的用法取决于应用程序的范围。

最新更新