我有两个基类:
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
(对于汽车来说是f {。CarLogic
)。
但是如果我创建CarImportLogic
类,那个继承自ImportLogic<Car>
我也不能继承CarLogic
。
我提出的一个解决方案是让ImportLogic包含DataLogic属性,但我不喜欢它,因为它使代码更加不清楚,我需要公开数据方法。
那么,我怎样才能实现这些目标:
答案 0 :(得分:0)
所以我最初误解了你的问题,所以让我指出一些事情,也许它们就是你所需要的。 从您提供的代码可以看出,您的逻辑类都必须是抽象的。在这种情况下,DataLogic类作为抽象是无用的,因为它没有公共方法。 ImportLogic依赖于DataLogic.Validate,但您需要先将其公开。接下来,您似乎想要创建一个包含两个功能的类,在这种情况下,最好将Logic类作为接口,并使用默认功能创建一个抽象类。
interface IValidate<T>
{
IEnumerable<string> Validate(T objectToValidate);
}
interface IImport<T>
{
IEnumerable<string> Import(Stream importFileStream);
}
abstract class LogicWrapper<T> : IValidate<T>, IImport<T>
{
protected virtual bool Editable(T o)
{
return true;
}
protected virtual bool Viewable(T o)
{
return true;
}
public abstract IEnumerable<string> Validate(T objectToValidate);
public IEnumerable<string> Import(Stream importFileStream)
{
return this.Validate(default(T));
}
}
class CarLogic : LogicWrapper<Car>
{
public override IEnumerable<string> Validate(Car objectToValidate)
{
throw new NotImplementedException();
}
}
很难说这是你正在寻找的,还是正确的班级结构,因为我不知道你打算如何使用CarLogic
课程。如果你想保持你的代码优雅和易于开发,只需遵循SOLID原则,你会没事的。