Несколько конструктор в базовом классе и вызовите наиболее подходящий из производного класса в Kotlin - PullRequest
0 голосов
/ 26 октября 2018

У меня есть базовый класс с двумя конструкторами, который принимает errorMessage и errorCode.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)

Я хочу спроектировать конструктор моего производного класса следующим образом;

, если система предоставляет только errorMessage, я хочу вызвать 1.Constructor в базовом классе.Если система предоставляет оба параметра, я хочу вызвать 2.Constructor.

Какое проектное решение подойдет здесь как лучшее решение?

1 Ответ

0 голосов
/ 26 октября 2018

Ну, вы называете нужную вам перегрузку, это довольно просто.

ВАРИАНТ 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){

}

ПРИМЕЧАНИЕ * Сохранение в локальных переменных необходимо только в том случае, если вы выполняете привязку данных get / set или другие аннотации, для которых требуется добавить переменную.

Счастливое кодирование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...