Problem med barn till NSMutableArray

Tråden skapades och har fått 9 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • International user
  • 2003-09-25 21:12

Har lite problem med arv från NSMutableArray, när jag i en metod i den nya klassen försöker köra count så får jag vid körning.

"*** -count only defined for abstract class. Define count in <Klassnamn>"

Varför är detta, count är ju korrekt definierad i NSMutableArray eller NSArray, borde ju inte vara några problem?

Tja, dokumentationen säger ju:

Citat:

The following table describes the NSArray methods that provide the basis for all NSArray's other methods; that is, all other methods are implemented in terms of these three. If you create a subclass of NSArray, you need only ensure that these base methods work properly. Having done so, you can be sure that all your subclass's inherited methods operate properly.

Misstänker att det beror på att superklassen ju inte kan veta hur din klass lagrar data...

  • Medlem
  • International user
  • 2003-09-25 21:57

Men min klass har inte hand om nån egen lagring av data, så jag tycker att NSMutableArrays definitioner av de metoderna borde gälla och räcka.

Citat:

Skrevs ursprungligen av surak
Men min klass har inte hand om nån egen lagring av data, så jag tycker att NSMutableArrays definitioner av de metoderna borde gälla och räcka.

Du har inte funderat på att göra en category istället för att ärva, det brukar oftast vara smidigare...

http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/3objc_language_overview/chapter_3_section_7.html

Hmm? Är det Java eller Obj-C vi pratar?

  • Medlem
  • International user
  • 2003-09-26 00:52
Citat:

Skrevs ursprungligen av Anders Ödlund
Du har inte funderat på att göra en category istället för att ärva, det brukar oftast vara smidigare...

http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/3objc_language_overview/chapter_3_section_7.html

Mjaeo, i detta fallet tyckte jag inte det passade så bra att utöka med hjälp av en category. Det skulle funkat men jag skulle fortfarande gräma över varför det inte går att ärva.

Senast redigerat 2003-09-26 01:16

Ok, ni diskuterar således antikviteter...

Om det är Objective-C, vilket det verkar vara, så ska nog jag sluta stoppa i näsan (jag pratar nämlligen om NSMutableArray i Java, i WebObjects... ).

Citat:

Skrevs ursprungligen av surak
Mjaeo, i detta fallet tyckte jag inte det passade så bra att utöka med hjälp av en category. Det skulle funkat men jag skulle fortfarande gräma över varför det inte går att ärva.

Problemet ligger troligtvis i att NSMutableArray inte är en vanlig klass utan ett klass-cluster:

Citat:

NSArray and NSMutableArray are part of a class cluster, so arrays are
not actual instances of the NSArray or NSMutableArray classes but of one
of their private subclasses. Although an array's class is private, its
interface is public, as declared by these abstract superclasses, NSArray
and NSMutableArray.

Vill du absolut lösa det via arv så får du läsa in dig lite på hur man gör för att ärva klasser som ingår i ett cluster, hittade något om att man måste överlagra lite fler metoder, men kolla i Apples documentation eller sök på: http://cocoa.mamasam.com

  • Medlem
  • International user
  • 2003-09-26 15:26

Verkar vara väldigt osmidigt att ärva från NSMutableArray, så antingen blir det väl att utöka via categories eller så får min klass ha en NSMutableArray istället för att vara en.

Tack för alla svar iaf.

Hej,
det här med att ärva är inte alls lika vanligt i ObjC som i t.ex. C++. Skälet till det ligger i designfilosofin bakom resp. språk.

Den vanligaste (om man får uttrycka sig så vagt) formen av klasser ärver direkt från NSObject (rotklassen) och bygger sedan upp funktionalitet mha "composition" dvs ett antal instanser av diverse klasser.

Jämför frågan "är en ..." respektive "har en ...". Exv. min klass är en lista kontra min klass har en lista.

Vissa klasser är inte alls avsedda att ärvas från, t.ex. generiska container-klasser som NSArray/Dictionary/Set. Det finns sällan behov av det eftersom de kan innehålla alla andra sorters objekt. Jfr. C++ som kräver(?) att du deklarerar vilken typ av objekt som ska lagras.

Känner man att man bara måste ha någon viss funktionalitet så är kategorier antagligen tillräckliga, som påpekats tidigare.

Ett fåtal klasser är att betrakta som "abstrakta" (begreppet saknar betydelse i ObjC), t.ex. NSView som måste subklassas.

För att se hur ovanligt ärvning är, så öppna fliken Classes i PB och välj Hierarcy, all classes i pop-up menyn.
De flesta klasser ärver bara från NSObject, somliga ärver i ett led (t.ex. NSArray -> NSMutableArray), medan ett fåtal har en lång kedja t.ex. NSResponder (i AppKit).

Som sagt, ObjC har en annan OO-filosofi än C++ (som lärs ut i parti och minut vid universitet och högskolor...)

/Per

1
Bevaka tråden