gpt4 book ai didi

scala - 在 Scala 中强制实现工厂的简洁方法

转载 作者:行者123 更新时间:2023-12-04 15:44:48 26 4
gpt4 key购买 nike

让我们假设我们有一个特征 T 。实现以下目标的最佳方法是什么:

  • 编写 T 实现的每个人都应该被迫提供一种可能性,允许无参数初始化 T ,即,我们可能必须强制实现可配置工厂。
  • 所有仅依赖于实际初始化参数(A 的特定实现 T )的逻辑/数据都应该集中处理/存储,但应该在工厂和 A 中都可用。

  • 我看到的最简单/简洁的方法(大约)是为工厂添加特征并将 T 链接到该工厂:
    trait T {
    val factory: TFactory
    }
    trait TFactory {
    def build(): T
    val description: String // example for logic/data that only depend on the parameters
    }

    // example implementation:
    class A(val factory: AFactory, paramA: Int, paramB: Int, paramC: Int) extends T

    class AFactory(paramA: Int, paramB: Int, paramC: Int) extends TFactory {
    def build = new A(this, paramA, paramB, paramC)
    val description = f"$paramA $paramB $paramC"
    }

    显然,这并没有真正“强制”工厂的实现(只要有可用的替代实现),显然可以生成 A 的实例化,它链接到“错误” TFactory 。我也不喜欢这种方法的是初始化参数的重复。我经常创建另一个类 AParams,它再次包装所有参数(例如为了方便添加新参数)。因此,我最终得到了三个类,恕我直言,这对于这个简单的问题来说是很多样板。

    我的问题是是否有一种(也许完全不同的)方法可以实现相同的主要目标但更简洁?

    最佳答案

    我不太确定我是否完全理解了您的要求,但您如何看待这种行为?

    trait TFactory{
    def build():T
    val description:String
    }

    trait T extends TFactory

    //can't declare A without build and not make it abstract
    class A(paramA: Int, paramB: Int, paramC: Int) extends T {
    def build = new A(paramA, paramB, paramC)
    val description = f"$paramA $paramB $paramC"
    }

    val a1 = new A(1, 4, 5)
    val a2 = a1.build()

    //We can give ourselves as a factory to something that expects TFactory
    val factory:TFactory = a1
    val a_new = factory.build()

    //More likely we can just give our build method
    def func(f: ()=>T) = {
    val new_t = f()
    new_t
    }
    val a_newer = func(a1.build)


    println(a1 +": " + a1.description)
    println(a2 +": " + a2.description)
    println(a_new +": " + a_new.description)
    println(a_newer +": " + a_newer.description)

    输出:
    Main$$anon$1$A@69267649: 1 4 5
    Main$$anon$1$A@69b1fbf4: 1 4 5
    Main$$anon$1$A@24148662: 1 4 5
    Main$$anon$1$A@3f829e6f: 1 4 5

    关于scala - 在 Scala 中强制实现工厂的简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20542997/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com