» »

[C#] overloaded operator ==

[C#] overloaded operator ==

losnah ::

Težave imam z overloadanjem in ker nisem na internetu najdu nč pametnga, morem uprašat tuki.
Rad bi primerjal dva razreda A in B. If(A == B) then neki; ... Primerjal bi spremenljivke x , y, z. Če bi bile enake bi bil pogoj true.
Spodi je koda ki sem jo spisol s pomočjo še enih strani sam ne dela. A mi lahko napišete pravilno oziroma kaj je narobe v kodi.

Zakaj morem overloadad še operator !=?
Zakaj morem dat še getHashCode(), in kaj naj bi to sploh počel pr men?
Kaj za vraga je tist object?

To sm prepisal z interneta. Sam neki ni kul.
                public override bool Equals(object o)
		{
			if((Plane)o.x == this.x && (Plane)o.y == this.y && (Plane)o.z == this.z)
				return true;
			else
				return false;
		}


------------------------------------------------------------------------------------------------------------
class Plane		
{
                private int x, y, z

                public override bool Equals(object o)
		{
			if((Plane)o.x == this.x && (Plane)o.y == this.y && (Plane)o.z == this.z)
				return true;
			else
				return false;
		}

		public static bool operator ==(Plane p1, Plane p2)
		{
			return p1.Equals(p2);
		}

		public static bool operator !=(Plane p1, Plane p2)
		{
			return ! p1.Equals(p2);
		}

		public override int GetHashCode()
		{
			return 1;
		}
}

atasmrk ::

Glede tega, da ti koda ne dela, Vec je oklepajev bolje je. Vsaj meni se tako zdi. Sovrazim, ce mi kak program ne pusti dati pogoja pri if v oklepaje. Zdi se mi, da ne prebavi tistega (nekaj == seNekaj && ...). Poizkusi ((nekaj == seNekaj) && (...)).

Zakaj moras overloadati se != operator: tole je ze en saj nazaj kar sem se ukvarjeal s tem, ampak mislim, da neki operatorji nastopajo v parih. Prav tako pa tudi nastopata par == in Equals in != getHashCode.

Object pa je praata vseh objektov v C#. Tako lahko primerjas bilokatere objekte med sabo, recimo, lahko bi prinerjal string z integerjem, ce bi prav spisal tale Equals.

Tako si jaz to predstavljam. Niti pod razno ni nujno, da je tako. Saj bo se kaksen komentar padel, pa se bom se jaz kaj naucil.

Zgodovina sprememb…

  • spremenilo: atasmrk ()

losnah ::

if((Plane)o.x == this.x && ...

Ko napišem "(Plane)o. " mi da na razpolago samo :
GetType
GetHash
ToString
Equals

Tist ko sem jest napisu x " (Plane)o.x " sem nek vidu kako je narejen sam men ne ponudi x.

Gundolf ::

Razjasni se, hoces primerjati dva objekta istega razreda ali razlicnih razredov?

Drugace pa ce napises ((Plane)o). ti bo morda ponudil tudi x.

BTW, pojma nimam o C# :D

losnah ::

dva objekta istega razreda.

Plane A = new Plane();
Plane B = new Plane();
.
.
.
if(A == B){
// x, y, z so enaki v obeh objektih
}
else{
// vsaj ena spremenljivka x, y, z je razlicna v obeh objektih
}

OwcA ::

Gundolfov nasvet se sliši dobro.
Otroška radovednost - gonilo napredka.

losnah ::

Sliši se dobro in tudi dela.

Hvala

user4683 ::

Še dodatek k vsem tem...
namesto:
if( ((Plane)o).x == this.x && ((Plane)o).y == this.y && ....

naredi takole:
Plane p = (Plane)o;
if( p.x == this.x && p.y == this.y && ....


Ker je pretvarjanje iz objecta v nek dolocen tip zelo zahtevno (unboxing), ter vzame kar nekaj ciklov. Tako namesto da unboxaš trikrat, boš unboxal samo enkrat ( Plane p = (Plane)o ).

Sergio ::

No ja, ce je kompajler vsaj na 1/4 pameten, bo unboxal samo enkrat v vsakem primeru.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

user4683 ::

Tudi to je res ;)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

problemi z javo

Oddelek: Programiranje
61037 (642) MrStein
»

C# - domača naloga

Oddelek: Programiranje
162042 (1583) IceBoX
»

Java Objekti

Oddelek: Programiranje
102109 (1803) Mavrik
»

c# kako nareidm kompleksnejsi object in ga primerjam z ==

Oddelek: Programiranje
8942 (770) Genetic
»

[Naloga][Java] Ulomki

Oddelek: Programiranje
62541 (2389) SkIDiver

Več podobnih tem