【问题标题】:Type inference and inheritance类型推断和继承
【发布时间】:2012-07-17 15:50:21
【问题描述】:

我有一个基类,它有一些使用类型推断的功能...

public abstract class Processor<T>
{
    ...
    public IProcessBuilder<T, TResult> Process<TResult>(Expression<Func<T, TResult>> propertyOfT)
    {
    }

    public abstract void SetProcessors();
}

然后我有两个类:

public class EntityBase
{
    public string Name { get; set; }
}

public class EntityChild : EntityBase
{
    public string Description { get; set; }
}

在这两个之上,我还有两个处理器来配置这两个类:

public class EntityBaseProcessor : Processor<EntityBase>
{
    public override void SetProcessors()
    {
        base.SetProcessors();
        this.Process(entity => entity.Name)
            .DoSomething();
    }
}

现在的问题是我想为子类重用基实体类的配置过程以避免代码重复:

public class EntityChildProcessor: EntityBaseProcessor
{
    public override void SetProcessors()
    {
        base.SetProcessor();
        this.Process(entity => /* entity.Description is of course missing */)
            .DoSomething();
    }
}

问题

我显然很累,因为我似乎找不到一种可行的方法来重用处理器类,因为继承的处理器类也应该使用继承的实体类进行处理。

我当然可以重复代码并将我的其他处理器编写为:

public class EntityChildProcessor: Processor<EntityChild>
{
    public override void SetProcessors()
    {
        base.SetProcessor();
        // repeated code for inherited property
        this.Process(entity => entity.Name)
            .DoSomething();
        this.Process(entity => entity.Description)
            .DoSomething();
    }
}

【问题讨论】:

    标签: c# generics inheritance type-inference


    【解决方案1】:

    使 EntityBaseProcessor 也通用:

    public class EntityBaseProcessor<T> : Processor<T> where T : EntityBase
    
    public class EntityChildProcessor<T> : EntityBaseProcessor<T> where T : EntityChild
    

    或者:(您可以用非泛型 EntityChildProcessor 的简单性换取永久设置 T 类型的缺点)

    public sealed class EntityChildProcessor : EntityBaseProcessor<EntityChild>
    

    【讨论】:

    • +1:您的回答也帮助了我的解决方案,但我接受了另一个答案以获得更完整的代码。仍然会为您提供有效答案的积分。
    【解决方案2】:

    EntityBaseProcessor 声明为泛型类对您来说是否合理?像这样的:

    public class EntityBaseProcessor<TEntityBase> : Processor<TEntityBase>
        where TEntityBase : EntityBase
    {
        public override void SetProcessors()
        {
            base.SetProcessors();
            this.Process(entity => entity.Name)
                .DoSomething();
        }
    }
    
    public class EntityChildProcessor : EntityBaseProcessor<EntityChild>
    {
        public override void SetProcessors()
        {
            base.SetProcessors();
            this.Process(entity => entity.Description)
                .DoSomething();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-04
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 2019-06-08
      • 2021-10-21
      • 1970-01-01
      相关资源
      最近更新 更多