美文网首页
{C#}流畅方法.泛型递归

{C#}流畅方法.泛型递归

作者: 码农猫爸 | 来源:发表于2021-08-15 06:11 被阅读0次

背景

  • 结合泛型和递归,也能实现流畅方法,但比较烧脑
  • 实现
    • Gx<T>继承Gy<T>或抽象类A(即递归),引入Gy<T>或A的内容
    • Gn(=Gx|Gy)输入类型和方法输出类型均为T(=EmployeeDirector),保持一致
    • Gn的方法输出类型是其子类,符合返回容器的原则
    • EmployeeDirector中的方法返回自身,符合返回容器的原则
    • 可通过EmployeeDirector类理解以上含义

示例

using static System.Console;

namespace FluentRecursiveGeneric
{
    public class Employee
    {
        public string Name { get; set; }
        public string Position { get; set; }
        public double Salary { get; set; }

        public override string ToString()
            => $"Name: {Name}, Position: {Position}, Salary: {Salary}";
    }

    public abstract class EmployeeBuilder
    {
        protected Employee employee = new Employee();

        public EmployeeBuilder() { }

        public Employee Build() => employee;
    }

    public class EmployeeNameBuilder<T> : EmployeeBuilder
        where T : EmployeeNameBuilder<T>
    {
        public T SetName(string name)
        {
            employee.Name = name;
            return (T)this; // T为当前类的子类,才能转换
        }
    }

    public class EmployeePositionBuilder<T> : EmployeeNameBuilder<T>
        where T : EmployeePositionBuilder<T>
    {
        public T SetPosition(string position)
        {
            employee.Position = position;
            return (T)this;
        }
    }

    public class EmployeeSalaryBuilder<T> : EmployeePositionBuilder<T>
        where T : EmployeeSalaryBuilder<T>
    {
        public T At(double salary)
        {
            employee.Salary = salary;
            return (T)this;
        }
    }

    // 继承薪资类取得At()方法
    // 嵌套类中均返回类型T = EmployeeDirector
    public class EmployeeDirector : EmployeeSalaryBuilder<EmployeeDirector>
    {
        // 返回容器类
        public static EmployeeDirector NewEmployee => new EmployeeDirector();
    }

    class Program
    {
        static void Main(string[] args)
        {
            var employee = EmployeeDirector.NewEmployee
                .SetName("Zhang")
                .SetPosition("Manager")
                .At(1000)
                .Build();

            WriteLine(employee);
            ReadKey();
        }
    }
}

相关文章

  • {C#}流畅方法.泛型递归

    背景 结合泛型和递归,也能实现流畅方法,但比较烧脑 实现Gx继承Gy或抽象类A(即递归),引入Gy

  • C#基础提升系列——C#泛型

    C# 泛型(Generics) 泛型概述 泛型是C#编程语言的一部分,它与程序集中的IL(Intermediate...

  • C#泛型方法

    下面一段代码用于判断某个输入值是否落在最大值和最小值的区间范围内,如果是就返回这个输入值,否则返回控件原来的值. ...

  • Java 泛型

    泛型类 例如 泛型接口 例如 泛型通配符 泛型方法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型上下边...

  • C#---API-02(Application Programm

    一、泛型概述 1. 泛型 1.1 泛型是什么? 泛型(generic)是C#语言2.0和通用语言运行时(CLR)得...

  • TS 笔记九 泛型

    参考C# 泛型 泛型与非泛型集合[https://www.jianshu.com/p/e45e7573f928] ...

  • 泛型的使用

    泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法 泛型类 泛型接口 泛型通配符 泛型方法 静态方法与...

  • C# 泛型 泛型与非泛型集合

    一、为什么使用泛型编程? 参考C#泛型编程[https://zhuanlan.zhihu.com/p/401837...

  • C#基础提升系列——C#集合

    C#集合 有两种主要的集合类型:泛型集合和非泛型集合。 泛型集合被添加在 .NET Framework 2.0 中...

  • 【开源项目】springfox-bridge采用多维递归结合ja

    springfox-bridge项目中,关于泛型问题,采用3个递归模型,动态生成泛型类的代理类,解决泛型擦除问题。...

网友评论

      本文标题:{C#}流畅方法.泛型递归

      本文链接:https://www.haomeiwen.com/subject/mvdhbltx.html