基类中的多个构造函数,并从Kotlin的派生类中调用最合适的一个

时间:2018-10-26 12:30:46

标签: kotlin

我有一个带有两个构造函数的基类,它们接受num_weeks = len(week_list) num_idxs = len(df['index'].unique()) print('creating dummies') _dummy_idxs = list(itertools.chain.from_iterable( itertools.repeat(x, 24*7*num_weeks) for x in df['index'].unique())) print('\t_dummy_idxs') _dummy_weeks = list(itertools.chain.from_iterable( itertools.repeat(x, 24*7) for x in week_list)) * num_idxs print('\t_dummy_weeks') _dummy_days = list(itertools.chain.from_iterable( itertools.repeat(x, 24) for x in range(0,7))) * num_weeks * num_idxs print('\t_dummy_days') _dummy_hours = list(range(0,24)) * 7 * num_weeks * num_idxs print('\t_dummy_hours') print('Creating dummy_hour_df with {0} rows...'.format(len(_dummy_hours))) # the part below takes the longest time dummy_hour_df = pd.DataFrame({'index': _dummy_idxs, 'week': _dummy_weeks, 'day': _dummy_days, 'hour': _dummy_hours}) print('dummy_hour_df completed') errorMessageerrorCode是强制性的,而errorMessage不是强制性的。

errorCode

和具有主要构造函数的派生类

class FooBaseClass{

constructor(errorMessage: String)                   // 1. Constructor
constructor(errorMessage: String, errorCode: Int)   // 2. Constructor

}

我想按如下方式设计派生类的构造函数;

如果系统仅提供class FooDerivedClass(errorMessage: String, errorCode: Int) : FooBaseClass(errorMessage, errorCode) ,我想在基类中调用1.Constructor。如果系统同时提供两个参数,则我想调用2.Constructor。

什么样的设计解决方案最适合这里?

1 个答案:

答案 0 :(得分:3)

您称呼您需要的过载,这很简单。

选项1

class FooBaseClass{
    constructor(errorMessage: String){

    }                   
    constructor(errorMessage: String, errorCode: Int){

    }
}

class FooDerivedClass : FooBaseClass{
     constructor(errorMessage: String) : super(errorMessage)
     constructor(errorMessage: String, errorCode: Int : super(errorMessage, errorCode)
}

我还要说的是,如果您不在这些构造函数中执行独立的操作,则使用默认值之类的会更容易。

选项2

class FooBaseClass{                  
    constructor(errorMessage: String, errorCode: Int? = null){
        if(errorCode != null){
            //use it
        }
    }
}

class FooDerivedClass : FooBaseClass{
   constructor(errorMessage: String, errorCode: Int? = null : super(errorMessage, errorCode)
}

只是一个建议。而且您可以更进一步,如果只有一个构造函数,则可以简单地执行默认构造函数,例如:

选项3

class FooBaseClass(errorMessage: String, errorCode: Int? = null){
    val errStr: String = errorMessage
    val errCode: Int? = errorCode        
}

class FooDerivedClass
    constructor(errorMessage: String, errorCode: Int? = null : super(errorMessage, errorCode){

}

注意*仅在执行获取/设置数据绑定或其他需要添加变量的注释时,才需要在局部变量中存储。

快乐编码

相关问题