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
动物
而不是可食
动物(伪代码)中定义此项:
因此,您可以定义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 }