Pertanyaan Apa perbedaan antara Early and Late Binding?


Apa perbedaan antara pengikatan awal dan akhir?


75
2017-08-14 02:24


asal


Jawaban:


Jawaban singkatnya adalah bahwa pengikatan awal (atau statis) mengacu pada pengikatan waktu pengikatan dan pengikatan akhir (atau dinamis) mengacu pada pengikatan runtime (misalnya ketika Anda menggunakan refleksi).


53
2017-08-14 02:16



Dalam bahasa yang dikompilasi, perbedaannya mencolok.

Jawa:

//early binding:
public create_a_foo(*args) {
 return new Foo(args)
}
my_foo = create_a_foo();

//late binding:
public create_something(Class klass, *args) {
  klass.new_instance(args)
}
my_foo = create_something(Foo);

Pada contoh pertama, kompiler dapat melakukan berbagai hal rapi pada waktu kompilasi. Yang kedua, Anda hanya perlu berharap bahwa siapa pun yang menggunakan metode itu sangat bertanggung jawab. (Tentu saja, JVM yang baru mendukung Class<? extends Foo> klass struktur, yang dapat sangat mengurangi risiko ini.)

Manfaat lain adalah bahwa IDE dapat melakukan hotlink ke definisi kelas, karena itu dinyatakan di sana dalam metode. Panggilan untuk create_something (Foo) mungkin sangat jauh dari definisi metode, dan jika Anda melihat definisi metode, mungkin bagus untuk melihat penerapannya.

Keuntungan utama dari pengikatan akhir adalah membuat hal-hal seperti inversi-of-control lebih mudah, serta beberapa penggunaan polimorfisme dan duck-typing lainnya (jika bahasa Anda mendukung hal-hal semacam itu).


15
2017-08-14 02:16



Diambil langsung dari http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htm

Ada dua cara menggunakan Otomatisasi (atau OLE Automation) ke   secara terprogram mengontrol aplikasi lain.

Akhir pengikatan menggunakan CreateObject untuk membuat dan contoh dari   objek aplikasi, yang kemudian dapat Anda kendalikan. Misalnya, untuk membuat   contoh baru Excel menggunakan pengikatan akhir:

 Dim oXL As Object
 Set oXL = CreateObject("Excel.Application")

Di sisi lain, untuk memanipulasi contoh Excel yang ada (jika   Excel sudah terbuka) Anda akan menggunakan GetObject (tidak peduli apakah itu   Anda menggunakan pengikatan awal atau akhir):

 Dim oXL As Object
 Set oXL = GetObject(, "Excel.Application")

Untuk menggunakan pengikatan awal, Anda harus terlebih dahulu menetapkan referensi di Anda   memproyeksikan ke aplikasi yang ingin Anda manipulasi. Dalam VB Editor dari   aplikasi Office apa pun, atau dalam VB itu sendiri, Anda melakukan ini dengan memilih   Alat + Referensi, dan pilih aplikasi yang Anda inginkan dari   daftar (misalnya "Perpustakaan Objek Microsoft Excel 8.0").

Untuk membuat contoh Excel baru menggunakan pengikatan awal:

 Dim oXL As Excel.Application
 Set oXL = New Excel.Application

Dalam kasus apa pun, secara kebetulan, Anda dapat mencoba mendapatkan yang sudah ada terlebih dahulu   contoh Excel, dan jika itu mengembalikan kesalahan, Anda dapat membuat yang baru   contoh dalam handler kesalahan Anda.


6
2017-08-14 02:21



Jawaban serupa tetapi lebih rinci dari buku Herbert Schildt C ++: -

Pengikatan awal mengacu pada peristiwa yang terjadi pada waktu kompilasi. Pada dasarnya, pengikatan awal terjadi ketika semua informasi yang diperlukan untuk memanggil fungsi diketahui pada waktu kompilasi. (Dengan kata lain, pengikatan awal berarti bahwa objek dan panggilan fungsi terikat selama kompilasi.) Contoh pengikatan awal termasuk pemanggilan fungsi normal (termasuk fungsi pustaka standar), pemanggilan fungsi yang kelebihan muatan, dan operator yang kelebihan beban. Keuntungan utama untuk mengikat awal adalah efisiensi. Karena semua informasi yang diperlukan untuk memanggil fungsi ditentukan pada waktu kompilasi, jenis panggilan fungsi ini sangat cepat.

Kebalikan dari ikatan awal terlambat mengikat. Akhir mengikat mengacu untuk memfungsikan panggilan yang tidak diselesaikan hingga waktu habis. Fungsi-fungsi virtual digunakan untuk mencapai pengikatan akhir. Seperti yang Anda ketahui, ketika akses melalui pointer atau referensi dasar, fungsi virtual yang sebenarnya disebut ditentukan oleh jenis objek yang ditunjuk oleh pointer. Karena dalam banyak kasus ini tidak dapat ditentukan pada waktu kompilasi, objek dan fungsi tidak terhubung sampai waktu berjalan. Keuntungan utama untuk pengikatan akhir adalah fleksibilitas. Tidak seperti pengikatan awal, pengikatan akhir memungkinkan Anda membuat program yang dapat merespons peristiwa yang terjadi saat program dijalankan tanpa harus membuat sejumlah besar "kode kontingensi." Perlu diingat bahwa karena pemanggilan fungsi tidak diselesaikan hingga waktu berjalan, penjilidan akhir dapat membuat waktu eksekusi yang agak lambat. Namun hari ini, komputer cepat telah secara signifikan mengurangi waktu eksekusi yang terkait dengan pengikatan akhir.


4



Dalam bahasa yang ditafsirkan, perbedaannya sedikit lebih halus.

Rubi:

# early binding:
def create_a_foo(*args)
  Foo.new(*args)
end
my_foo = create_a_foo

# late binding:
def create_something(klass, *args)
  klass.new(*args)
end
my_foo = create_something(Foo)

Karena Ruby (umumnya) tidak dikompilasi, tidak ada compiler untuk melakukan hal-hal yang bagus di depan. Pertumbuhan JRuby berarti semakin banyak Ruby yang dikompilasi saat ini, sehingga membuatnya lebih mirip Java, di atas.

Masalah dengan IDE masih berdiri: sebuah platform seperti Eclipse dapat mencari definisi kelas jika Anda mem-hard-code mereka, tetapi tidak dapat jika Anda membiarkannya kepada pemanggil.

Inversion-of-control tidak terlalu populer di Ruby, mungkin karena fleksibilitas runtime yang ekstrim, tetapi Rails sangat memanfaatkan pengikatan akhir untuk mengurangi jumlah konfigurasi yang diperlukan untuk membuat aplikasi Anda berjalan.


3



public class child()
{    public void method1()
     {     System.out.println("child1");
     }
    public void method2()
     {     System.out.println("child2");
     }

}
public class teenager extends child()
{    public void method3()
     {      System.out.println("teenager3");
     }
}
public class adult extends teenager()
{     
    public void method1()
    {    System.out.println("adult1);
         super.method1();
     }
}


//In java
public static void main(String []args)
{    ((teenager)var).method1();
}

Ini akan dicetak

adult1
child1

Pada awal mengikat kompilator akan memiliki akses ke semua metode pada anak dan remaja tetapi pada pengikatan akhir (saat waktu proses), ia akan memeriksa metode yang ditimpa saat runtime.

Oleh karena itu metode1 (dari anak - pengikatan awal) akan ditimpa oleh metode1 dari orang dewasa saat runtime (terlambat mengikat) Maka akan menerapkan metode 1 dari anak karena tidak ada metode 1 dalam metode 1 pada remaja.

Perhatikan bahwa jika anak tidak memiliki metode1 maka kode di utama tidak akan dikompilasi.


0



Polimorfisme waktu kompilasi juga disebut sebagai overloading atau pengikatan awal atau pengikatan statis ketika kita memiliki nama metode yang sama dengan perilaku yang berbeda. Dengan mengimplementasikan beberapa prototipe dari metode yang sama dan perilaku yang berbeda terjadi di dalamnya. Pengikatan awal mengacu pada kompilasi pertama dari program. Tetapi pada objek pengikatan akhir adalah runtime yang terjadi dalam program. Juga disebut sebagai Dynamic binding atau override atau Runtime polymorphism.


0