Как создать класс, который будет использоваться другими классами, когда в kotlin есть только несколько различий между переменными - PullRequest
0 голосов
/ 05 января 2019

У меня есть 4 фрагмента, каждый из которых использует один и тот же код, за исключением нескольких переменных.

переменные различаются по имени, и затем есть функции, которые вызывают эти переменные. но весь остальной код копируется и вставляется. 99% то же самое.

Как правильно создать класс, от которого другие классы могут наследовать, и переопределить имена этих 2-3 переменных и вызовов функций

например:

    import android.content.Context
import android.content.Intent
import android.content.pm.ActivityInfo
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView

import kotlinx.android.synthetic.main.activity_multiplication_game.*

class MultiplicationGame : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_multiplication_game)
        supportActionBar!!.hide() // REMOVES ACTION BAR
        val prefs = this.getSharedPreferences("com.QuickMaths", MODE_PRIVATE) // preference to keep track of ad number


        val insertPoint = insert_point as ViewGroup
        val ed: TextView = editTextAnswers as TextView

        val context: Context = this@MultiplicationGame
        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

        // gets the number of rows and digits. Now implement the game
        val rowNumber = intent.getStringExtra("rowNumber").toInt()
        val digitNumber = intent.getStringExtra("digitNumber").toInt()
        var numberOfQuestions = intent.getStringExtra("NumberOfQuestions").toInt()
        val atLeastOrAtMostDigits = intent.getStringExtra("NumberOfAtLeastDigits").toInt()
        val atLeastOrAtMostRows = intent.getStringExtra("NumberOfAtLeastRows").toInt()

        //Main menu button
        mainMenu.setOnClickListener {
            val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
        }

        val game = CreateLayout(rowNumber, digitNumber, insertPoint, context, atLeastOrAtMostDigits,atLeastOrAtMostRows)
        Log.d("poopAdditionGame", atLeastOrAtMostDigits.toString())
        val timeKeeper = KeepTime()

        game.generateViewsWithNumbers(2)

        //gets the number of questions for the counter that sits on top
        val totalQuestions = numberOfQuestions
        showQuestionsLeft.text = numberOfQuestions.toString() + "/" + totalQuestions.toString()

        //checks the answers to see if they are correct
        ed.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {
                val aftertextchanged = ed.text.toString()
                if (game.totalProduct.toString() == aftertextchanged) {
                    //things happen here

                }
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
                //To change body of created functions use File | Settings | File Templates.
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                //Nothing
            }
        })

    }


    // the keyboard
    fun numberButton(view: View) {
        val buttonClicked: Button = view as Button
        val viewtext: TextView = editTextAnswers as TextView
        var buttonClickedValue = viewtext.text.toString()

        when (buttonClicked.id) {
            button8.id -> buttonClickedValue += "1"
            button7.id -> buttonClickedValue += "2"
            button6.id -> buttonClickedValue += "3"
            button9.id -> buttonClickedValue += "4"
            button10.id -> buttonClickedValue += "5"
            button11.id -> buttonClickedValue += "6"
            button12.id -> buttonClickedValue += "7"
            button13.id -> buttonClickedValue += "8"
            button14.id -> buttonClickedValue += "9"
            button16.id -> buttonClickedValue += "0"
        }
        viewtext.text = buttonClickedValue
    }

    fun clearButton(view: View) {
        val viewtext: TextView = editTextAnswers as TextView
        viewtext.text = ""
    }

    fun delButton(view: View) {
        val viewtext: TextView = editTextAnswers as TextView
        var mutList = viewtext.text.split("")
        viewtext.text = mutList.toMutableList().dropLast(2).joinToString("")
    }
}

этот код является одним и тем же точным кодом для 4 различных видов деятельности, КРОМЕ переменной totalSum заменено на продукт и разницу. и game.generateViewsWithNumbers(2) 2 должен быть 1 или 3 в зависимости от активности Дело в том, как я могу переработать код, имея в виду только небольшие различия и изменить их.

1 Ответ

0 голосов
/ 05 января 2019

Вам просто нужно создать базовый фрагмент / действие.

abstract class MultiplicationGame : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_multiplication_game)
        supportActionBar!!.hide() // REMOVES ACTION BAR
        val prefs = this.getSharedPreferences("com.QuickMaths", MODE_PRIVATE) // preference to keep track of ad number 
    //Rest of the code

И реализовать это в действиях, которые будут использовать тот же код. я не понял на 100%, что вам нужно, чтобы отличаться от totalSum, потому что я не смог найти его в вашем коде.

Относительно этого:

 game.generateViewsWithNumbers(2)

Если вам просто нужно значение int в каждом упражнении, вы можете сделать что-то вроде этого:

abstract intValue: Int
game.generateViewsWithNumbers(intValue)

А потом дочернему действию просто нужно присвоить значение переменной.

...