Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin:防止混合使用相同类型的参数_Kotlin - Fatal编程技术网

Kotlin:防止混合使用相同类型的参数

Kotlin:防止混合使用相同类型的参数,kotlin,Kotlin,我怎样才能不让猫吃晚饭呢 data class Animal( val name: String ) data class ToDo( val toEat: List<Animal>, val toFeed: List<Animal>, ) val cats = listOf(Animal("fluffy")) val chickens = listOf(Animal("chic")) // help

我怎样才能不让猫吃晚饭呢

data class Animal(
    val name: String
)

data class ToDo(
    val toEat: List<Animal>,
    val toFeed: List<Animal>,
)

val cats = listOf(Animal("fluffy"))
val chickens = listOf(Animal("chic"))

// help the kittens!!!
ToDo(cats, chickens)

数据类动物(
val名称:String
)
数据类待办事项(
瓦尔·托亚特:名单,
val toFeed:列表,
)
瓦尔猫=列表(动物(“毛茸茸的”))
val鸡=列表(动物(“chic”))
//帮助小猫!!!
待办事项(猫、鸡)
注意:这是一个简化的示例,我无法将
/
的类型更改为类似
/
鸡的类型。

OOP解决方案 您可以执行以下操作:

  • Animal
    应该是一个接口
  • Cat
    Chicken
    应该是
    Animal
    的两个不同实现
  • 您可以定义一个名为
    Eatable
    的接口,该接口将有具体的实现
  • val-toEat:List
    中更改
    val-toEat:List
  • Cat将执行
    动物
    而不是
    可食
  • 另一个解决方案 对不起,我刚才读到,你不能为猫和鸡定义两个不同的类。 您仍应在
    动物
    (伪代码)中定义此项:


    因此,您可以定义
    Animal.eat(Animal)
    来检查您正在尝试吃的动物是否可以被吃掉。

    如果您不能给它们不同的类型,那么我认为编译器无法发现这个问题。不过,您可以通过简单地给出参数名称来让问题变得更加明显:

    ToDo(toEat = chickens, toFeed = cats)
    
    这样,就可以很清楚地知道哪个列表包含哪个参数。(这也意味着参数的顺序无关紧要;您可以交换它们,只要每个参数都给定一次。)

    如果你把它们混在一起,它仍然可以编译:

    ToDo(toEat = cats, toFeed = chickens)
    
    …但至少这是显而易见的,不需要您查看文档来查看问题

    但是,调用方仍然可以选择省略参数名称。为了避免这种情况,您必须重新构造ToDo类。例如,您可以使用生成器模式,并给出如下内容:

    ToDo().toEat(chickens).toFeed(cats)
    
    或者您可以简单地从构造函数中删除参数,要求调用方按名称设置属性,例如:

    ToDo().apply{ toEat = chickens; toFeed = cats }
    

    当然,这些调用有点冗长,但是强制调用方显式地给出属性名——同样,这使得问题对于人类读者(如果不是编译器)来说相当明显。

    仅仅交换参数有什么错?我希望未来的me/其他开发人员避免这种情况发生
    ToDo().apply{ toEat = chickens; toFeed = cats }