Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 18805|Svar: 0

[Kommunikation] Lighederne og forskellene mellem virtuel og (abstrakt) abstraktion og interface i C#...

[Kopier link]
Opslået på 22/04/2019 14.41.09 | | |
Fortolkning 1

I C# er abstrakt og virtuelt forvirrende, begge relateret til arv, og involverer brug af override. Lad os diskutere forskellene mellem de to:

1. Virtuel metode

virtuelt nøgleord bruges til at ændre metoder i basisklassen. Der er to situationer, hvor virtuel bruges:

Scenarie 1: En virtuel metode defineres i basisklassen, men den virtuelle metode omskrives ikke i den afledte klasse. I kaldet til den afledte klasseinstans bruger den virtuelle metode den metode, der er defineret af basisklassen.

Scenarie 2: En virtuel metode defineres i basisklassen, og derefter omskrives metoden ved hjælp af override i den afledte klasse. I kaldet til den afledte klasseinstans bruger den virtuelle metode den afledte omskrivningsmetode.

2. Abstrakt metode (abstrakt metode)

Det abstrakte nøgleord kan kun bruges i abstrakte klasser til at ændre metoder, og der findes ingen specifik implementering. Implementeringen af abstrakte metoder skal implementeres ved hjælp af override-nøgleordet i den afledte klasse.

Den mest væsentlige forskel mellem et interface og en abstrakt klasse: en abstrakt klasse er en ufuldstændig klasse, en abstraktion af et objekt, mens en interface er en adfærdsnorm.


3. Nøgleord

Statisk: Når en metode erklæres som statisk, er metoden en statisk metode, og compilatoren beholder implementeringen af metoden ved kompileringstidspunktet. Det vil sige, metoden tilhører en klasse, men ikke noget medlem, uanset om en instans af klassen eksisterer eller ej. Ligesom indgangsfunktionen Static void Main, fordi det er en statisk funktion, kan den kaldes direkte.

Virtua: Når en metode erklæres som virtuel, er det en virtuel metode, indtil du bruger ClassName-variablen = ny ClassName(); Før man erklærer en instans af en klasse, eksisterer den ikke i det virkelige hukommelsesrum. Dette nøgleord bruges meget ofte i klassearv for at give polymorfi-understøttelse for klassemetoder.

overrride: angiver en omskrivning Denne klasse arver fra Shape-klassen
virtuelt, abstrakt er at fortælle andre klasser, der vil arve fra ham, at du kan tilsidesætte denne metode eller egenskab hos mig, ellers er det ikke tilladt.
abstrakt: Abstrakt metodedeklaration er en metode, der skal tilsidesættes af en afledt klasse, som bruges til at blive arvet; Det kan betragtes som en imaginær metode uden realisering; Hvis en klasse indeholder en abstrakt metode, skal klassen defineres som en abstrakt klasse, uanset om den indeholder andre generelle metoder eller ej; Abstrakte klasser kan ikke have substanser.

a) Metoden for den virtuelle modifikation skal have en metodeimplementering (selv hvis det kun er et par klamrer), og metoden for den abstrakte modifikation kan ikke have en implementering.

b) virtuel kan omskrives af underklasser, abstrakt skal omskrives af underklasser

c) Hvis en funktion i en klasse ændres ved abstakt, skal klassenavnet også ændres med abstakt

d) Abstrakte modificerede klasser kan ikke oprettes som instanser.

e) Hvis en metode i C# er forberedt til at omskrive forældreklassen i underklassen, skal metoden modificeres med virtual i forældreklassen og overide i underklassen, hvilket undgår at programmøren ved et uheld omskriver forældremetoden for forældreklassen i underklassen.

Bemærk: Klasser modificeret med abstrakt kan kun arves, ikke instansieres.

Fortolkning 2

Både virtuel og abstrakt bruges til at modificere forældreklassen, hvilket gør det muligt at omdefinere børneklassen ved at overskrive definitionen af forældreklassen.

De har én ting til fælles: hvis de bruges til at ændre metoder, skal der tilføjes offentlig foran dem, ellers vil der opstå kompileringsfejl: virtuelle metoder eller abstrakte metoder kan ikke være private. Når alt kommer til alt, gør tilføjelsen af virtuel eller abstrakt det muligt at omdefinere underklassen, og private medlemmer kan ikke tilgås af underklassen.

Men de er meget forskellige. (virtuel er "virtuel", abstrakt er "abstrakt").

(1) Metoden med virtuel modifikation skal implementeres (selv hvis den kun tilføjer et par krøvler), mens metoden med abstrakt modifikation ikke må implementeres. For eksempel, hvis metoden med virtuel modifikation ikke er implementeret:

Fejl: "Test1.fun1()" skal erklære kroppen, fordi den ikke er markeret som abstrakt, ekstern eller delvis   

For abstrakte modifikatorer, hvis implementeret:


Fejl: "Test2.fun2()" kan ikke erklære kroppen, fordi den er markeret som abstrakt   

(2) virtuel kan omskrives af underklasser, mens abstrakt skal omskrives af underklasser.
Der er ingen fejl i kompileringen; hvis metoden med virtuel modifier omskrives, skal override tilføjes foran den (hvilket fortæller compileren, at du vil omskrive den virtuelle metode), og der skal være en implementering, ellers vil kompileringen være forkert:
(3) Hvis et klassemedlem modificeres af abstrakt, skal abstrakt tilføjes før klassen, fordi kun abstrakte klasser kan have abstrakte metoder.

(4) Instanser af abstrakte klasser kan ikke oprettes, de kan kun arves og kan ikke instansieres, for eksempel: BaseTest2 base2 = ny BaseTest2(); Der vil være en kompileringsfejl: En abstrakt klasse eller interface kan ikke oprette en instans.

(5) I C#, hvis du vil omskrive en metode i en underklasse, skal du tilføje virtuel før forældremetoden og overskrive før underklassemetoden, for at undgå at programmører ved et uheld omskriver forældremetoden i underklassen.

(6) Den abstrakte metode skal overskrives, og den virtuelle metode skal have en implementering (selv hvis det er en metode defineret i den abstrakte klasse).
Fortolkning 3
Ligheder:
1. De kan alle arves
2. Ingen af dem kan instansieres
3. Den kan indeholde metodedeklarationer
4. Afledte klasser skal implementere urealiserede metoder
Skelne:
1. Abstrakte baseklasser kan definere felter, attributter og metodeimplementeringer. Grænseflader kan kun definere attributter, indeksere, begivenheder og metodedeklarationer, og kan ikke indeholde felter.
2. En abstrakt klasse er en ufuldstændig klasse, der skal forfines yderligere, mens en grænseflade er en adfærdsnorm. Microsofts brugerdefinerede grænseflader leveres altid med et effektivt felt, der beviser, at de er udtryk for "Jeg kan gøre det..." ”
3. Grænseflader kan implementeres flere gange, og abstrakte klasser kan kun arves af én person
4. Abstrakte klasser er mere definerede mellem en række nært beslægtede klasser, mens de fleste grænseflader er løst beslægtede, men alle implementerer en bestemt funktion
5. Abstrakte klasser er begreber, der er abstraheret fra en række beslægtede objekter, så de afspejler tingenes interne fællesnævn; Et interface er en funktionel konvention defineret for at opfylde eksterne kald, så den afspejler tingenes eksterne karakteristika
6. Grænsefladen har grundlæggende ingen specifikke arvelige egenskaber, den lover kun en metode, der kan kaldes
7. Interfacet kan bruges til at understøtte callbacks, men arv har ikke denne funktion
8. De specifikke metoder, der implementeres af abstrakte klasser, er virtuelle som standard, men grænseflademetoderne i klassen, der implementerer grænsefladen, er som standard ikke-virtuelle, og du kan selvfølgelig også erklære dem virtuelle
9. Hvis den abstrakte klasse implementerer grænsefladen, kan metoden i grænsefladen kortlægges til den abstrakte klasse som en abstrakt metode uden at skulle implementere den, men metoden i grænsefladen kan implementeres i underklassen af den abstrakte klasse
Regler for brug:
1. Abstrakte klasser bruges hovedsageligt til nært beslægtede objekter, mens grænseflader bedst bruges til at give generel funktionalitet for irrelevante klasser
2. Hvis du vil designe en stor funktionel enhed, brug abstrakte klasser; Hvis du vil designe små, præcise funktionelle blokke, så brug interfaces.
3. Hvis flere versioner af komponenten forventes at blive oprettet, opret en abstrakt klasse. Når et interface er oprettet, kan det ikke ændres. Hvis en ny version af grænsefladen er nødvendig, skal der oprettes en helt ny grænseflade.
4. Hvis den oprettede funktion skal bruges mellem et bredt udvalg af heterogene objekter, brug grænsefladen; Hvis du vil levere fælles implementeret funktionalitet på tværs af alle implementeringer af en komponent, så brug abstrakte klasser.
5. Analyser objektet, forfine den interne fællesnævner for at danne en abstrakt klasse, som bruges til at udtrykke objektets essens, altså "hvad". Grænseflader prioriteres, når eksterne kald eller funktioner skal udvides
6. En god grænsefladedefinition bør være specifik og funktionel, ikke multifunktionel, ellers vil det forårsage grænsefladeforurening. Hvis en klasse kun implementerer én funktion i grænsefladen, men skal implementere andre metoder i grænsefladen, kaldes det grænsefladeforurening
7. Prøv at undgå at bruge arv for at opnå formationsfunktionen, men brug black box-multipleks, altså objektkombination. På grund af stigningen i antallet af arveniveauer er den mest direkte konsekvens, at når du kalder en klasse i denne taxon, skal du lægge dem alle ind i stacken! Konsekvenserne kan forestilles. (Kombineret med forståelse af stakprincippet). Samtidig kan interesserede venner bemærke, at Microsoft ofte bruger objektkombinationsmetoden, når de bygger en klasse. For eksempel har Page-klassen i asp.net egenskaber som Server Request, men i virkeligheden er de alle objekter i en bestemt klasse. At bruge dette objekt i Page-klassen til at kalde metoder og egenskaber for andre klasser er et meget grundlæggende designprincip
For eksempel:
Vinduesformer kan designes med abstrakte klasser, og offentlige operationer og egenskaber kan placeres i en abstrakt klasse, så formen og dialogboksen kan arve fra denne abstrakte klasse og derefter udvide og forbedre efter deres egne behov.

Printoperationen kan leveres som grænseflade til hver formular, der har brug for denne funktion, fordi indholdet af formularen er forskelligt, og de skal implementere deres egen printfunktion efter deres egne krav. Når man printer, kaldes det kun via grænsefladen, uanset hvilken formular der udskrives.

Fællesnævner, individualitet og valg:
Nogle bøger skriver, at C# anbefaler at bruge interfaces i stedet for abstrakte baseklasser, og understreger de mange fordele ved at bruge interfaces, hvilket jeg ikke tør være uenig i; ud fra ovenstående liste er der stadig mange forskelle mellem de to, og eksistensen af denne forskel må afgøre forskellen i relevante scenarier, for eksempel kan den abstrakte baseklasse levere standardimplementeringer for visse metoder, for at undgå gentagen implementering af dem i underklasser og forbedre genanvendeligheden af koden. Dette er fordelen ved abstrakte klasser; Grænsefladen kan kun indeholde abstrakte metoder. Hvad angår hvornår man skal bruge abstrakte baseklasser og hvornår man skal bruge grænseflader, afhænger det af, hvordan brugerne ser forbindelserne mellem arvede klasser, om det er personlighedsforskelle eller fælles forbindelser mellem dem. Lad mig illustrere med et livseksempel.

Hvis du får tre objekter, nemlig mennesker, fisk og frøer, og du bliver bedt om at designe en basiskategori for dem for at opsummere forbindelsen mellem dem, så vil det første, du føler, være, at der er store forskelle mellem dem, og det er svært at abstrahere fællestrækkerne. Her bør du overveje at bruge interfaces i stedet for abstrakte baseklasser af tre grunde:
1. Individualitet er større end fællesnævn.
2. Personligheder med store forskelle har nogle af de samme adfærdstræk.
3. Der er store forskelle i realiseringsmetoderne for den samme adfærd.
På dette tidspunkt får du tre objekter mere, nemlig crucian carp, carp og goldfish, og du kan stadig designe baseklasser for at opsummere forbindelsen mellem dem, og det første du indser er, at de alle tilhører fisk, og det andet er, at deres måde at svømme på kan være en smule anderledes, så du bør bruge abstrakte baseklasser i stedet for interfaces; sammenlignet med ovenstående eksempel er der tre grunde:
1. Fællesnævn er større end individualitet
2. Individer med samme fællesnævner skal have de samme egenskaber og adfærd
3. Der er visse forskelle i implementeringsmetoderne for den samme adfærd
Blandt de flere grunde til at bruge grænseflader eller abstrakte baseklasser er den tredje grund faktisk den samme, som beskriver begrebet polymorfi i objektorienteret, det vil sige, at det implementeres ved at overskrive forældreklassen og kalde den tilsvarende metode under kørsel i henhold til den oversendte objektreference. Den anden årsag begynder at divergere, hvor grænseflader lægger vægt på den samme adfærd mellem arvede objekter, mens abstrakte klasser også fremhæver de samme egenskaber mellem arvede objekter. Det, der virkelig adskiller grænseflader fra abstrakte basisklasser, er følgende grunde:

Grænseflader bruges, når man søger funktionel fællesnævner mellem objekter med store forskelle.
Abstrakte basisklasser bruges, når funktionelle forskelle søges mellem objekter med større fællesnævn.
Ved at sammenligne det samme og det forskellige kan vi kun sige, at grænseflader og abstrakte klasser har deres egne styrker, men der er ingen fordele. I selve programmeringspraksis skal vi måle vores talenter ud fra den specifikke situation, men følgende erfaring og opsamling kan give dig inspiration, ud over noget af min opsamling, kommer mange af dem fra klassikerne, og jeg tror, de kan modstå prøven. Så i reglerne og ved lejlighederne lærer vi disse klassikere, det vigtigste er at anvende det, vi har lært, selvfølgelig vil jeg vinde alles latter med en families ord, fortsæt venligst.

Regler og begivenheder:
1. Husk, at et af de vigtigste principper for objektorienteret tænkning er: grænsefladeorienteret programmering.
2. Med hjælp fra grænseflader og abstrakte klasser er mange idéer i de 23 designmønstre blevet klogt implementeret, og jeg tror, deres essens simpelthen er, at de er orienteret mod abstrakt programmering.
3. Abstrakte klasser bør primært bruges til nært beslægtede objekter, mens grænseflader bedst bruges til at give generel funktionalitet for irrelevante klasser.
4. Grænsefladen fokuserer på CAN-DO-forholdstypen, mens den abstrakte klasse fokuserer på IS-A-forholdet.
5. Adfærden af multidefinerede objekter i grænsefladen; abstrakte klasser multidefinerer objekters egenskaber;
6. Grænsefladedefinitioner kan bruge offentlige, beskyttede, interne og private modifikatorer, men næsten alle grænseflader defineres som offentlige, så der er ikke behov for at sige mere.
7. "Grænsefladen forbliver uændret" er en vigtig faktor, der bør tages i betragtning. Derfor bør der tilføjes nye interfaces, når man tilføjer udvidelser fra interfaces, ikke eksisterende interfaces.
8. Prøv at designe grænsefladen som en funktionel blok med en enkelt funktion, med .NET Framework som eksempel, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable osv. indeholder alle kun én fælles metode.
9. Det store bogstav "I" foran interfacenavnet er en konvention, ligesom feltnavnet starter med et understreg, bedes du overholde disse principper.
10. I grænsefladen er alle metoder som standard offentlige.
11. Hvis versionsproblemer forventes, kan du oprette en "abstrakt klasse". For eksempel, hvis du skaber en hund, en høne og en and, bør du overveje at abstrahere dyr for at håndtere ting, der kan opstå i fremtiden. Tilføjelse af nye medlemmer til grænsefladen tvinger alle afledte klasser til at blive ændret og genkompileret, så versionsproblemer implementeres bedst med abstrakte klasser.
12. Ikke-abstrakte klasser, der er afledt af abstrakte klasser, skal inkludere alle arvede abstrakte metoder og faktiske implementeringer af abstrakte accessorer.
13. Det nye nøgleord kan ikke bruges til abstrakte klasser, og de kan heller ikke forsegles, fordi abstrakte klasser ikke kan instansieres.
14. Statiske eller virtuelle modifikatorer kan ikke bruges i abstrakte metodedeklarationer.





Tidligere:C# Enum Simple Permission Design bruger egenskaben FlagsAttribute
Næste:Huang Yongs Yiyun-klasseværelse har en nul-baseret forståelse af WeChat mini-programmet
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com