如何从其他泛型类中创建泛型类继承方法

时间:2017-08-17 10:52:03

标签: c# generics inheritance architecture polymorphism

我有两个基类:

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属性,但我不喜欢它,因为它使代码更加不清楚,我需要公开数据方法。

那么,我怎样才能实现这些目标:

  • 拥有不同业务对象的泛型类。
  • 只在一个地方拥有验证逻辑。
  • 可以从ImportLogic类到达验证逻辑。
  • 让我的代码优雅且易于开发。

1 个答案:

答案 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原则,你会没事的。