Samtalbas inuti åsidosättningsmetod

Jag vet att det finns frågor om att anropa basmetoden i en åsidosatt metod som detta . Men vad händer om en åsidosatt metod bara kallar basklassen? Är detta dåligt / bra värdighet? Det verkar bara konstigt, varför åsidosätta en metod bara för att ringa basen ändå?

Se till exempel:

public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } } 

Kommentarer

  • Det tjänar inget syfte och förstör bara koden, så bli av med den.
  • @DavidArno att ' det jag tänkte också, bara se till att det inte fanns ' en anledning till det innan jag gjorde det
  • I en idealisk värld kommer appen att täckas av enhetstester, så att du kan ta bort det, och när alla test fortfarande är klara ' visste du att det inte behövdes '. Vi lever dock inte ', så det var vettigt att fråga 🙂
  • Den enda anledningen till att jag ' låt koden se ut som ovan skulle vara om det fanns mer kod i den åsidosatta metoden tidigare och den togs bort, men kunde ses genom gamla versioner i källkontrollsystemet. Att lämna en artefakt i den aktuella koden så här kan signalera till utvecklaren idag att se filen ' historik för den tidigare versionen av metoden.

Svar

Men tänk om en åsidosatt metod bara kallar basklassen? Är den här dåliga / bra designen?

Dålig design ? Nej, ganska dåligt genomförande. Det är vilseledande för underhållsprogrammeraren. När jag inte ser en åsidosättning så vet jag att basen heter. En åsidosättning säger att det finns något annorlunda, även om basen också kallas in där.


Att kräva en åsidosättning för att ringa basen utan en mall är dålig design

Referenstråd – mest populära answser

Min initial reaktion på den skandinaviska åsidosättningen modell är: CODING HORROR! Det ser ut som att jag tvingas läsa allt detta, och sedan mer, för att se till att ”underbeteendet” inte bryter min kod och vice versa.

Mallmetodmönster är ett bra sätt att uttrycka variabelkod inom något större kodflöde och säkerställa korrekt körningsordning.

Enligt min erfarenhet är det så typiskt för en underklass att behöva veta vilka basdeklarerade metoder att ringa och i ordning. Ta en hopfull handfull underklasser alla med samma cut-n-paste-kontrollstruktur, lägg till 5 års underhåll; nu förstår du varför jag föredrar 101 bevis Vilda Turkiet .

P.S. Allt detta är en stor anledning till att jag strävar mot överanvändningen av interface s i stället för abstract klasser.

Kommentarer

  • Överanvändningen av gränssnitt i C # kommer sannolikt från att inte vilja böja implementatören till den specifika abstrakta basklassen. Genom att använda ett gränssnitt kan implementeraren implementera en annan basklass, och inte bara den specifika abstraktklassen. Det beror dock mycket på omständigheterna. Jag tycker att det är bra att ha både ett IFoo -gränssnitt och en FooBase -klass, som implementerar IFoo gränssnitt, med abstrakta metod-samtal för metoderna och autoegenskaperna för rekvisita. Kasta kanske in en ctor också.

Svar

IMO, virtual metoder, i basklass, har mycket grundläggande implementering. Även om vi override definitionen av virtual -metoden i barnklass, kan vi fortfarande ringa virtual -metoden (med grundläggande implementering) medan det är vettigt och inte påverkar det avsedda beteendet hos overridden -metoden i underklassen.

Till exempel BaseCalculator gör det riktiga arbetet. Kalkylatorn dekorerar BaseCalculator-biblioteket genom att utöka det.

public class BaseCalculator { public virtual T Add<T>(T number01, T number02) { return number01 + number02; } } public class Calculator: BaseCalculator { public override T Add<T>(T number01, T number02) { Console.WriteLine(number01 + " | " + number02); var result = base.Add<int>(1, 3); Console.WriteLine("Result: "+ result); return result; } } 

F: Vad händer om en åsidosatt metod bara kallar basklassen?

A: I ditt fall har du basklassmetoden som virtual, vi behöver inte override tills vi vill ändra dess beteende.

F: Är detta dålig / bra värdighet?

A: Ja, det kan vara dåligt design eftersom det kan störa källkodfilen medan vi lägger till onödiga åsidosättningar.

F: Det verkar bara konstigt, varför åsidosätta en metod bara för att ringa basen ändå?

A: BaseCalculator gör det verkliga arbetet . Miniräknare dekorerar BaseCalculator-biblioteket genom att utöka det.

Hoppas det hjälper!

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *