Apa perbedaan antara metode kelas dan contoh?

448

Apa perbedaan antara metode kelas dan metode contoh?

Apakah metode instan pengakses (pengambil dan penyetel) sementara metode kelas hampir semuanya adalah segalanya?

Berbakti
sumber

Jawaban:

673

Seperti sebagian besar jawaban lain katakan, metode instance menggunakan instance kelas, sedangkan metode kelas dapat digunakan hanya dengan nama kelas. Dalam Objective-C mereka didefinisikan demikian:

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

Mereka kemudian dapat digunakan seperti ini:

[MyClass aClassMethod];

MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];

Beberapa contoh dunia nyata dari metode kelas adalah metode kenyamanan pada banyak kelas Foundation seperti NSString's +stringWithFormat:atau NSArray' s +arrayWithArray:. Metode contoh akan NSArray's -countmetode.

Cory Kilger
sumber
7
Jawaban yang bagus. Perlu juga dicatat bahwa Anda akan melihat notasi steno khusus untuk menggambarkan metode. Sebagai contoh, + [NSString stringWithFormat:] adalah metode kelas + stringWithFormat: on NSString; - [NSArray objectAtIndex:] adalah metode instance. Metode dengan beberapa bagian pemilih ditulis seperti - [NSMutableDictionary setObject: forKey:] dll. Anda akan sering melihat notasi ini dalam tanggapan, dokumentasi, dan dalam Xcode Cocoa.
Quinn Taylor
149
Saya akan menambahkan bahwa metode kelas disebut metode "statis" dalam banyak bahasa lain. Dan untuk menjawab pertanyaan awal, pengakses adalah metode instan karena mereka menetapkan dan mendapatkan keadaan instance tertentu. Dalam contoh di atas, jumlah NSArray mengembalikan jumlah objek dalam contoh tertentu.
Brian Pan
2
"sedangkan metode kelas dapat digunakan hanya dengan nama kelas." atau objek kelas
user102008
2
Maaf atas kegembiraan saya ... tetapi saya baru belajar perbedaannya, dan potensinya. metode kelas rock dan begitu juga kelas singleton! ufff aku jatuh cinta! <3
Pavan
2
@BrianPan metode statis dan kelas tidak sama. Mereka serupa tetapi alasan mereka diberi nama berbeda adalah karena mereka bekerja secara berbeda. Misalnya, metode statis tidak dapat diganti.
Sulthan
190

Semua detail teknis telah tercakup dengan baik dalam jawaban lainnya. Saya hanya ingin berbagi analogi sederhana yang menurut saya dengan baik menggambarkan perbedaan antara kelas dan contoh:

masukkan deskripsi gambar di sini

Sebuah kelas adalah seperti cetak biru dari sebuah rumah: Anda hanya memiliki satu cetak biru dan (biasanya) Anda tidak bisa melakukan itu banyak dengan cetak biru saja.

masukkan deskripsi gambar di sini

Sebuah contoh (atau objek ) adalah sebenarnya rumah yang dibangun berdasarkan cetak biru: Anda dapat membangun banyak rumah-rumah dari cetak biru yang sama. Anda kemudian dapat mengecat dinding dengan warna yang berbeda di masing-masing rumah, sama seperti Anda dapat secara independen mengubah properti setiap instance kelas tanpa mempengaruhi instance lainnya.

Johannes Fahrenkrug
sumber
6
@JohannesFahrenkrug Nicely menjelaskan konsep untuk kelas dan objek di sini. Bukankah pertanyaan sebenarnya adalah untuk difference between class method and an instance method ;
Shekhu
1
Penjelasan sempurna tentang Kelas vs Contoh kelas. Kelas adalah konsep yang aneh bagi pemula dan ini menjelaskannya dengan cara yang paling mendasar.
Alex McPherson
1
@JohannesFahrenkrug benar-benar penjelasan yang baik, yang membuat saya berpikir bagaimana keduanya berbeda dan kapan harus menggunakan keduanya
ChenSmile
1
Penjelasan yang luar biasa :)
Praveenkumar
1
Analogi yang bagus. Tolong seseorang memberi orang ini persediaan pizza setahun.
GeneCode
102

Seperti jawaban lain yang telah dikatakan, metode instance beroperasi pada objek dan memiliki akses ke variabel instansinya, sementara metode kelas beroperasi pada suatu kelas secara keseluruhan dan tidak memiliki akses ke variabel instance tertentu (kecuali jika Anda melewatkan instance sebagai parameter).

Contoh yang baik dari metode kelas adalah metode tipe-kontra, yang mengembalikan jumlah total instance dari kelas. Metode kelas dimulai dengan a +, sedangkan yang contoh dimulai dengan a -. Sebagai contoh:

static int numberOfPeople = 0;

@interface MNPerson : NSObject {
     int age;  //instance variable
}

+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end

@implementation MNPerson
- (id)init{
    if (self = [super init]){
          numberOfPeople++;
          age = 0;
    }    
    return self;
}

+ (int)population{ 
     return numberOfPeople;
}

- (int)age{
     return age;
}

@end

main.m:

MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);

Output: Umur: 0 Jumlah orang: 2

Contoh lain adalah jika Anda memiliki metode yang Anda ingin agar pengguna dapat menelepon, kadang-kadang ada baiknya membuat metode kelas. Misalnya, jika Anda memiliki kelas bernama MathFunctions, Anda bisa melakukan ini:

+ (int)square:(int)num{ 
      return num * num;
}

Jadi, pengguna akan menelepon:

[MathFunctions square:34];

tanpa harus instantiate kelas!

Anda juga dapat menggunakan fungsi kelas untuk mengembalikan objek autoreleased, seperti NSArray

+ (NSArray *)arrayWithObject:(id)object

Itu mengambil objek, meletakkannya dalam array, dan mengembalikan versi array autoreleased yang tidak harus dikelola memori, bagus untuk array temperership dan yang tidak.

Saya harap Anda sekarang mengerti kapan dan / atau mengapa Anda harus menggunakan metode kelas !!

micmoo
sumber
1
micmoo, mungkin saya sarankan Anda meletakkan "static int numberOfPeople = 0;" dalam teks yang diformat kode? Saya bingung sampai saya perhatikan di atas kode sampel. Selain itu, jawaban yang sangat ringkas.
mobibob
2
Maafkan kebingungan pemula saya, tetapi mengapa Anda membutuhkan kedua variabel instan "usia" dan metode contoh "usia"? Tidakkah pengambil dan penyetel misalnya variabel "usia" dibuat dengan @synthetize?
selytch
@selytch "age" harus didefinisikan sebagai properti untuk menggunakan synthetize.
micah94
36

Metode instance berlaku untuk turunan kelas (yaitu objek) sedangkan metode kelas berlaku untuk kelas itu sendiri.

Dalam C # metode kelas ditandai statis. Metode dan properti yang tidak ditandai statis adalah metode instan.

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}
Robert Horvick
sumber
1
Argh - maaf, saya baru memperhatikan ini adalah pertanyaan Obj-C. Semoga jawaban saya masih berlaku tetapi harap pilih atau pilih untuk menghapus.
Robert Horvick
6
Tidak ada salahnya dilakukan. Bagian pertama dari jawaban Anda benar sebagai prinsip OOP umum, dan itu pasti berlaku untuk Objective-C. Anda dapat menambahkan "objektif-c" ke daftar tag Anda untuk mengabaikan jika Anda tidak ingin melihat pertanyaan seperti itu, meskipun partisipasi pasti diterima. :-)
Quinn Taylor
16

Jawaban untuk pertanyaan Anda tidak spesifik untuk objektif-c, namun dalam berbagai bahasa, metode Kelas dapat disebut metode statis.

Perbedaan antara metode kelas dan metode instance adalah

Metode kelas

  • Beroperasi pada variabel Kelas (mereka tidak dapat mengakses variabel instan)
  • Tidak memerlukan objek yang akan dipakai untuk diterapkan
  • Kadang-kadang bisa menjadi bau kode (beberapa orang yang baru menggunakan OOP sebagai penopang untuk melakukan Pemrograman Terstruktur dalam lingkungan OO)

Metode instance

  • Operasikan variabel instan dan variabel kelas
  • Harus memiliki objek instanciated untuk beroperasi
hhafez
sumber
Metode instance dapat beroperasi pada variabel kelas?
蘇健豪
16

Saya pikir cara terbaik untuk memahami ini adalah dengan melihat allocdan init. Penjelasan inilah yang memungkinkan saya untuk memahami perbedaan.

Metode Kelas

Metode kelas diterapkan ke kelas secara keseluruhan. Jika Anda memeriksa allocmetode, itu adalah metode kelas yang dilambangkan dengan +sebelum deklarasi metode. Ini adalah metode kelas karena diterapkan ke kelas untuk membuat contoh spesifik dari kelas itu.

Metode Instance

Anda menggunakan metode instance untuk memodifikasi instance spesifik dari kelas yang unik untuk instance itu, bukan ke kelas secara keseluruhan. initmisalnya (dilambangkan dengan -sebelum deklarasi metode), adalah metode instance karena Anda biasanya memodifikasi properti dari kelas itu setelah dibuat alloc.

Contoh

NSString *myString = [NSString alloc];

Anda memanggil metode kelas allocuntuk menghasilkan turunan dari kelas itu. Perhatikan bagaimana penerima pesan adalah kelas.

[myString initWithFormat:@"Hope this answer helps someone"];

Anda memodifikasi instance NSStringdipanggil myStringdengan menetapkan beberapa properti pada instance itu. Perhatikan bagaimana penerima pesan adalah instance (objek kelas NSString).

Adam Waite
sumber
Apa yang Anda maksud dengan memeriksa metode "alokasi"? Bisakah Anda mengarahkan saya ke tempat tertentu dalam dokumentasi? (sunting) -> ahh Nevermind, yeah dalam dokumen NSObject dikatakan bahwa di bawah "Tugas" - developer.apple.com/library/ios/documentation/cocoa/reference/…
Ethan Parker
Anda tidak benar-benar perlu memahami apa yang benar-benar dilakukan untuk memahami hal ini, hanya saja itu diterapkan pada kelas. Sederhananya: allocmengalokasikan memori yang cukup untuk objek, initakan mengubah apa yang ada di alamat memori tersebut untuk menentukan keadaan objek. Kami tidak dapat memodifikasi objek kecuali ada ruang untuk memodifikasinya, jadi kami menggunakan allockelas yang akan memutuskan memberi kami ruang itu.
Adam Waite
6

Metode kelas biasanya digunakan untuk membuat instance dari kelas itu

Misalnya, [NSString stringWithFormat:@"SomeParameter"];mengembalikan sebuah NSStringinstance dengan parameter yang dikirim kepadanya. Oleh karena itu, karena ini adalah metode Kelas yang mengembalikan objek dari tipenya, itu juga disebut metode kenyamanan.

iosrookie
sumber
6

Jadi jika saya memahaminya dengan benar.

Sebuah classmetode tidak perlu Anda untuk mengalokasikan contoh yang objek untuk penggunaan / memprosesnya. Suatu classmetode mandiri dan dapat beroperasi tanpa ketergantungan dari keadaan objek apa pun dari kelas itu. Suatu classmetode diharapkan mengalokasikan memori untuk semua pekerjaannya sendiri dan membatalkan alokasi ketika selesai, karena tidak ada instance dari kelas yang akan dapat membebaskan memori yang dialokasikan dalam panggilan sebelumnya ke metode kelas.

Suatu instancemetode justru sebaliknya. Anda tidak dapat memanggilnya kecuali Anda mengalokasikan instance kelas itu. Seperti kelas normal yang memiliki konstruktor dan dapat memiliki destruktor (yang membersihkan semua memori yang dialokasikan).

Dalam kebanyakan kemungkinan (kecuali jika Anda menulis pustaka yang dapat digunakan kembali, Anda seharusnya tidak memerlukan classvariabel.

Siddharth
sumber
1
Kasus yang jelas di mana Anda memerlukan metode kelas adalah pembuatan instance. Anda harus dapat membuat instance tanpa memiliki instance apa pun, jika tidak instance pertama tidak akan pernah bisa dibuat. Itu sebabnya + dialokasikan adalah dan harus menjadi metode kelas.
gnasher729
4

Metode instance beroperasi pada instance kelas (yaitu, "objek"). Metode kelas dikaitkan dengan kelas (kebanyakan bahasa menggunakan kata kunci staticuntuk orang-orang ini).

bengkak
sumber
3

Ambil contoh gim di mana banyak mobil bertelur .. masing-masing milik kelas CCar. Ketika mobil dipakai, itu membuat panggilan ke

[CCar registerCar:self]

Jadi kelas CCar, dapat membuat daftar setiap CCar instantiated. Katakanlah pengguna menyelesaikan level, dan ingin menghapus semua mobil ... Anda bisa: 1- Pergi melalui daftar setiap CCar yang Anda buat secara manual, dan lakukan whicheverCar.remove(); atau 2- Tambahkan metode removeAllCars ke CCar, yang akan melakukan itu untuk Anda saat Anda memanggil [CCar removeAllCars]. Yaitu allCars[n].remove();

Atau misalnya, Anda mengizinkan pengguna untuk menentukan ukuran font default untuk seluruh aplikasi, yang dimuat dan disimpan saat startup. Tanpa metode kelas, Anda mungkin harus melakukan sesuatu seperti

fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();

Dengan metode kelas, Anda bisa lolos [FontHandler getDefaultFontSize].

Adapun fungsi removeVowels Anda, Anda akan menemukan bahwa bahasa seperti C # sebenarnya memiliki keduanya dengan metode tertentu seperti toLower atau toUpper.

misalnya myString.removeVowels() dan String.removeVowels(myString) (dalam ObjC itu akan menjadi [String removeVowels:myString]).

Dalam hal ini instance cenderung memanggil metode kelas, sehingga keduanya tersedia. yaitu

public function toLower():String{
  return String.toLower();
}

public static function toLower( String inString):String{
 //do stuff to string..
 return newString;
}

pada dasarnya, myString.toLower() panggilan [String toLower:ownValue]

Tidak ada jawaban pasti, tetapi jika Anda merasa ingin mendorong metode kelas akan meningkatkan kode Anda, coba, dan ingatlah bahwa metode kelas hanya akan membiarkan Anda menggunakan metode / variabel kelas lainnya.

sicklebrick
sumber
3

metode kelas

adalah metode yang dideklarasikan sebagai statis. Metode ini dapat dipanggil tanpa membuat instance kelas. Metode kelas hanya dapat beroperasi pada anggota kelas dan bukan pada anggota contoh karena metode kelas tidak mengetahui anggota contoh. Metode instance kelas juga tidak bisa dipanggil dari dalam metode kelas kecuali mereka dipanggil pada instance kelas itu.

Metode instance

di sisi lain memerlukan instance kelas untuk ada sebelum mereka dapat dipanggil, jadi instance kelas perlu dibuat dengan menggunakan kata kunci baru. Metode instance beroperasi pada instance kelas tertentu. Metode instance tidak dinyatakan sebagai statis.

iCrazyDev
sumber
Itu juga dapat dibuat dengan "mengalokasikan" kata kunci tidak hanya "baru". Selain itu, Objective-C tidak menuntut instance untuk memanggil metode instance, Anda dapat mengirim pesan ke pointer nol.
Elviss Strazdins
3

Di Objective-C semua metode dimulai dengan karakter "-" atau "+". Contoh:

@interface MyClass : NSObject
// instance method
- (void) instanceMethod;

+ (void) classMethod;
@end

Karakter "+" dan "-" menentukan apakah suatu metode adalah a class method atau instance methodmasing - masing.

Perbedaannya akan jelas jika kita memanggil metode ini. Di sini metode dinyatakan dalam MyClass.

instance method membutuhkan turunan dari kelas:

MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];

Di dalam MyClassmetode lain dapat memanggil metode instan MyClassmenggunakan self:

-(void) someMethod
{
    [self instanceMethod];
}

Tapi, class methodsharus dipanggil di kelas itu sendiri:

[MyClass classMethod];

Atau:

MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];

Ini tidak akan berfungsi:

// Error
[myClass classMethod];
// Error
[self classMethod];
Tulon
sumber
3

METODE KELAS


Metode kelas biasanya membuat instance baru dari kelas atau mengambil beberapa properti global kelas. Metode kelas tidak beroperasi pada instance atau memiliki akses ke variabel instance.


METODE INSTANSI


Metode instance beroperasi pada instance kelas tertentu. Misalnya, metode pengakses yang Anda laksanakan adalah semua metode instan. Anda menggunakannya untuk mengatur atau mendapatkan variabel instan dari objek tertentu.


MEMOHON


Untuk memanggil metode instance, Anda mengirim pesan ke instance kelas.

Untuk memanggil metode kelas, Anda mengirim pesan ke kelas secara langsung.


Sumber: IOS - Objective-C - Metode Kelas Dan Metode Instance

Nam N. HUYNH
sumber
1

Metode kelas tidak dapat mengubah atau mengetahui nilai variabel instan apa pun. Itu harus menjadi kriteria untuk mengetahui apakah metode instance dapat menjadi metode kelas.

Deepee
sumber
-1 dari saya, karena Anda dapat mengirimkan instance ke metode kelas dan itu akan dapat mengubah dan mengetahui nilai-nilai variabelnya.
Elviss Strazdins
1

Ingat juga, ide yang sama berlaku untuk variabel. Anda akan menemukan istilah-istilah seperti statis, anggota, instance, kelas dan sebagainya ketika berbicara tentang variabel yang sama seperti Anda untuk metode / fungsi.

Tampaknya istilah umum dalam komunitas Obj-C adalah ivar untuk variabel misalnya, tapi saya belum menjadi pria Obj-C.

Half_Duplex
sumber
1

Pembaruan untuk jawaban di atas, saya setuju metode instance menggunakan instance kelas, sedangkan metode kelas dapat digunakan hanya dengan nama kelas.

Tidak ada lagi perbedaan antara metode instance & metode kelas setelah penghitungan referensi otomatis muncul di Objective-C.

Untuk Contoh [NS StringWithformat:..]metode kelas & [[NSString alloc] initwihtformat:..]metode contoh, keduanya sama setelah ARC

pengguna1292809
sumber
1

Catatan: Ini hanya dalam format kode semu

Metode kelas

Hampir semua yang perlu dilakukan adalah selama waktu kompilasi . Itu tidak memerlukan input pengguna apa pun, atau perhitungannya tidak didasarkan pada instance. Segala sesuatu tentangnya didasarkan pada kelas / cetak biru —— yang unik yaitu Anda tidak memiliki banyak cetak biru untuk satu kelas. Bisakah Anda memiliki variasi berbeda selama waktu kompilasi? Tidak, oleh karena itu kelasnya unik dan jadi tidak peduli berapa kali Anda memanggil metode kelas, penunjuk yang menunjuknya akan sama.

PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.

Metode Instance

Sebaliknya metode instance terjadi selama runtime, karena hanya saat itulah Anda membuat instance dari sesuatu yang dapat bervariasi pada setiap instantiation.

initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
//As you can see the value can change for each instance.

Jika Anda berasal dari bahasa lain, metode statis sama dengan metode kelas.
Jika Anda berasal dari Swift, ketik metode sama dengan metode kelas.

Madu
sumber
0

Menambah jawaban di atas

Metode kelas akan bekerja di kelas, kita akan menggunakan ini untuk tujuan umum di mana seperti + stringWithFormat, ukuran kelas dan yang paling penting untuk init dll

NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat]; 

Metode Instance akan bekerja pada instance kelas bukan pada kelas seperti kita memiliki dua orang dan kami ingin mengetahui keseimbangan masing-masing secara terpisah di sini kita perlu menggunakan metode instance. Karena itu tidak akan mengembalikan respons umum. misalnya suka menentukan jumlah NSSArray dll.

[johnson getAccountBalance];
[ankit getAccountBalance];
Ankit garg
sumber