【问题标题】:How to make generic class inherit methods from other generic class如何使泛型类继承其他泛型类的方法
【发布时间】: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&lt;Car&gt; 这样的类来处理Car 对象的业务逻辑。

导入逻辑处理类似处理文件的操作。所以如果我想导入汽车清单。

现在,我只想在一个地方拥有汽车对象的验证方法,并且应该在 DataLogic(例如 CarLogic 用于汽车)。

但是,如果我创建 CarImportLogic 类,它继承自 ImportLogic&lt;Car&gt;,我也不能继承自 CarLogic

我想出的一个解决方案是给 ImportLogic 包含 DataLogic 属性,但我不喜欢它,因为它使代码更加不清晰,我需要公开数据方法。

那么,我该如何实现这些目标:

  • 具有不同业务对象的通用类。
  • 只有一个地方有验证逻辑。
  • 可以从 ImportLogic 类访问验证逻辑。
  • 让我的代码优雅且易于开发。

【问题讨论】:

  • 我认为你想要组合而不是继承,所以你的解决方案还不错。类似的方法是创建另一个将数据和导入逻辑包装在一起的类,例如装饰器。
  • @CrudaLilium 我在我的问题中写了关于命中的文章,由于组合我失去了当前代码的清晰度和灵活性。如果您可以提供将两种逻辑包装在一起的任何可行解决方案,请执行

标签: c# generics inheritance architecture polymorphism


【解决方案1】:

所以我最初误解了你的问题,所以让我指出一些事情,也许它们是你需要的。 从您提供的代码中可以看出,您的两个逻辑类都必须是抽象的。在这种情况下,DataLogic 类作为抽象是无用的,因为它没有公共方法。 ImportLogic 依赖于 DataLogic.Validate,但您需要先将其公开。接下来,您似乎想要创建一个包含两种功能的类,在这种情况下,最好将您的逻辑类作为接口并创建一个具有默认功能的抽象类。

    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 原则就可以了。

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 2021-10-21
    • 1970-01-01
    • 2018-09-27
    • 2015-09-15
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多