【发布时间】:2018-01-25 18:05:44
【问题描述】:
我有两个基类:
DataLogic<T>
{
protected abstract IEnumerable<string> Validate(T o);
protected virtual bool Editable(T o)
{
return true;
}
protected virtual bool Viewable(T o)
{
return true;
}
}
ImportLogic<T>
{
public IEnumerable<string> Import(Stream importFileStream)
{
...
IEnumerable<T> importedObjects;
...
foreach (var importedObject in importedObjects)
{
...
// HERE I WANT TO REACH METHOD FROM DATA LOGIC
var validationResult=Validate(importedObject);
...
}
...
}
protected abstract bool IsStructureValid(Worksheet sheetToValidate);
}
数据逻辑处理所有数据操作,如数据验证。所以我可以拥有像CarLogc : DataLogic<Car> 这样的类来处理Car 对象的业务逻辑。
导入逻辑处理类似处理文件的操作。所以如果我想导入汽车清单。
现在,我只想在一个地方拥有汽车对象的验证方法,并且应该在 DataLogic(例如 CarLogic 用于汽车)。
但是,如果我创建 CarImportLogic 类,它继承自 ImportLogic<Car>,我也不能继承自 CarLogic。
我想出的一个解决方案是给 ImportLogic 包含 DataLogic 属性,但我不喜欢它,因为它使代码更加不清晰,我需要公开数据方法。
那么,我该如何实现这些目标:
- 具有不同业务对象的通用类。
- 只有一个地方有验证逻辑。
- 可以从 ImportLogic 类访问验证逻辑。
- 让我的代码优雅且易于开发。
【问题讨论】:
-
我认为你想要组合而不是继承,所以你的解决方案还不错。类似的方法是创建另一个将数据和导入逻辑包装在一起的类,例如装饰器。
-
@CrudaLilium 我在我的问题中写了关于命中的文章,由于组合我失去了当前代码的清晰度和灵活性。如果您可以提供将两种逻辑包装在一起的任何可行解决方案,请执行
标签: c# generics inheritance architecture polymorphism