0

我有一个Transaction带有子类的类IncomeExpense并且有一个属性category。收入和支出有不同的类别,即 anIncomeCategoryExpenseCategory。我需要一份收入和支出的清单,所以我创建了一个交易清单。但我还需要访问他们的类别,所以Transaction还需要一个类别属性。由于类别可以采用的值是有限的,因此枚举或密封类将非常实用。但我需要一些超类型与子类型可互换的东西。

有没有办法指定一个通用类别,以便 Transaction 类可以接受IncomeCategoryExpenseCategory作为参数?

PS:抱歉标题太糟糕了,我想不出更好的方式来描述我的问题

4

1 回答 1

0

如果 Category 需要是一个密封的类(例如,IncomeCategory 和 ExpenseCategory 的实例需要携带状态),你会这样做。顶级 Transaction 类使用泛型类型来表示其类别,因此如果您想要两种 Transaction 类型的列表,您可以声明一个List<Transaction<Category>>.

sealed class Category
class IncomeCategory: Category()
class ExpenseCategory: Category()

abstract class Transaction<out T: Category>(val category: T)

class Income(category: IncomeCategory): Transaction<IncomeCategory>(category)
class Expense(category: ExpenseCategory): Transaction<ExpenseCategory>(category)

如果您需要能够更改类别实例,那么您不能在声明站点将类型声明T为协变out的,并且您必须在引用列表的地方声明它是协变的:List<Transaction<out Category>>。然后你可以使用var而不是valfor category

如果Category可以只是一个枚举,这更简单,因为您不需要泛型:

enum class Category {
    IncomeCategory,
    ExpenseCategory
}

abstract class Transaction(val category: Category)

class Income(): Transaction(Category.IncomeCategory)
class Expense(): Transaction(Category.ExpenseCategory)
于 2020-11-17T19:44:09.333 回答