abstract

 أولاً :مفهوم الـ abstract :-

نستطيع فيه جعل الدوال والمتغيرات معلنة فقط ولكن بشرط أن نضع كلمة abstract أمامها ، بمعنى أن الدوال في interface كنا نستطيع أن نعلن عنها فقط بدون أن ننشئ قطعة برمجية لها لأننا سنقوم بذلك في تصنيف أخر ، هنا أيضا نستطيع أن نعلن فقط عن الدالة بداخل هذا التصنيف ولكن يشترط أن نضع كلمة abstract لأن التصنيف أصلا هو abstract .


ثانياً:استخدام الـ abstract :-

هو عبارة عن تصنيف class ولكنه لا يقبل أن ننشئ منه كائن ، تصنيف نصممه للوراثة (أي لنجعل جميع محتوياته قابلة للوراثة لتصنيفات أخرى).


ثالثاً:انشاء تصنيف abstract :-

abstract class operation{
    
}

انشأنا تصنيف abstract إذا ما بداخله من دوال لكي يتم الإعلان عنها فقط بدون عملية بناء لها نجعلها abstract كما سيتم توضيحه الأن :-

abstract class operation{

    abstract fun sum(num1:Int , num2:Int)
    abstract fun sub(num1:Int , num2:Int)
    abstract fun mul(num1:Int , num2:Int)
    abstract fun dev(num1:Int , num2:Int)

}

حسنا لو أردنا تعريف المتغيرات :-

نرى أنه عندما أردنا تعريف متغير اعترض ووضع خط أحمر وعند الوقوف عليه ظهر السبب وهو أنه عندما تريد تعريف متغير إما أن تجعل له قيمة مبدئية أو أن تجعله abstract لكي تستطيع ألا تسند له قيمة أي يعني سوف تستخدمه وتسند له  فيما بعد .


رابعاً:مثال  :-

abstract class operation{

    abstract fun sum(num1:Int , num2:Int)
    abstract fun sub(num1:Int , num2:Int)
    abstract fun mul(num1:Int , num2:Int)
    abstract fun dev(num1:Int , num2:Int)

    fun sayWelcome(){
        println("Welcome")
    }

}

class oper : operation(){


    override fun dev(num1: Int, num2: Int) {
        var result = num1 / num2
        println("the result :$result")
    }

    override fun mul(num1: Int, num2: Int) {
        var result = num1 * num2
        println("the result :$result")    }

    override fun sub(num1: Int, num2: Int) {
        var result = num1 - num2
        println("the result :$result")    }

    override fun sum(num1: Int, num2: Int) {
        var result = num1 + num2
        println("the result :$result")    }

}

fun main(args:Array<String>){
    var op1 = oper()
    println("the result of sum :")
    op1.sum(4,3)
    println("the result of sub :")
    op1.sub(4,3)
    println("the result of mul :")
    op1.mul(3,4)
    println("the result of dev :")
    op1.dev(4,3)

    println("---------------------------")
    op1.sayWelcome()


}

ناتج التنفيذ :-

the result of sum :
the result :7
the result of sub :
the result :1
the result of mul :
the result :12
the result of dev :
the result :1
---------------------------
Welcome


خامساً: مبدأ الوراثة المتعددة multi inheritance:-

الوراثة المتعددة تعني أن تصنيف class يرث أكثر من تصنيف classes ولكن لغة kotlin ترفض مبدأ الوراثة المتعددة ولحل هذه المعضلة

وجدت لدينا interface وهي ماتعلمناه مسبقا بحيث نستطيع أن ننشئ تصنيف class يرث من تصنيف class وأيضا نقوم بعمل implements لـ interface ، مثال :-

interface showDepartment{
    fun showDept()
}

abstract class salary{
    abstract fun getSal()
}


class employee : salary(), showDepartment{


    override fun showDept() {

    }

    override fun getSal() {


    }

}