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一个帮助器类,包含在数据库访问器中,并为它们提供以前抽象的属性/方法的通用接口?或者我应该把它留作继承的情况?
这看起来像是一个通过基类/接口对泛型和继承都有好处的场景。
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)