抽象基础或助手类

KCh*_*oux 5 c# inheritance composition

我今天刚刚学到了一些关于Composition over Inheritance的知识.我想知道我是否应该将这个概念应用到我最近写的东西上.

我们之前有两个几乎相同的类,除了一些小的差异.它们包含一些基本的数据库访问功能,但是在不同(但相关)的对象类型上运行.所以我们之前的课程结构如下:

class BallMillDBHandler{

    public BallMillDBHandler(){ ... }

    public void InsertTool(BallMill tool) { ... }
    public BallMill QueryTool(string toolID) { ... }
    public void UpdateTool(BallMill tool) { ... }
    public void DeleteTool(string toolID) { ... }
}

class DiamondToolDBHandler{

    public DiamondToolDBHandler(){ ... }

    public void InsertTool(DiamondTool tool) { ... }
    public DiamondTool QueryTool(string toolID) { ... }
    public void UpdateTool(DiamondTool tool) { ... }
    public void DeleteTool(string toolID) { ... }
}
Run Code Online (Sandbox Code Playgroud)

我采用了大多数近似重复的方法并将它们重构为一个BaseToolDBHandler()类,并从其他两个方法继承它,提供了一些抽象的方法和属性来处理访问数据库参数本身的差异.

是否有意义的是,创建BaseToolDBHandler一个帮助器类,包含在数据库访问器中,并为它们提供以前抽象的属性/方法的通用接口?或者我应该把它留作继承的情况?

Dan*_*Dan 3

这看起来像是一个通过基类/接口对泛型和继承都有好处的场景。

class DBHandler<TTool> where TTool : ToolBase // or ITool
{
    public DBHandler(){ ... }

    public void InsertTool(TTool tool) { ... }
    public TTool QueryTool(string toolID) { ... }
    public void UpdateTool(TTool tool) { ... }
    public void DeleteTool(string toolID) { ... }
}
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以创建一个基类(可选抽象)或一个接口来用作类型约束,以保证您需要工具将某些成员包含在方法体内。

例子:

var handler = new DBHandler<BallMill>();
BallMill value = handler.QueryTool("xyz");
value.SomeProperty = "New Value";
handler.UpdateTool(value);
Run Code Online (Sandbox Code Playgroud)