Laden...

Warum ist die SHA256 Klasse abstract?

Erstellt von Timmi vor einem Jahr Letzter Beitrag vor einem Jahr 217 Views
T
Timmi Themenstarter:in
9 Beiträge seit 2018
vor einem Jahr
Warum ist die SHA256 Klasse abstract?

Hallo zusammen,

ich habe eine Frage zu Klasse SHA256.
Die ist laut den Docs abstrakt. Sie hat aber trotzdem einen Konstruktor. Das verstehe ich schon nicht, denn eine abstrakte Klasse soll ja eigentlich gar keine Instanzen haben.
Davon abgesehen gibt es dann aber noch eine Create() Methode, die eine Instanz erstellt und zurückgibt. Das verstehe ich dann noch weniger.

Warum ist das so?

Danke.

T
2.224 Beiträge seit 2008
vor einem Jahr

Die Create Methode liefert eine Instanz der SHA256 Implementierung.
Du arbeitest dann gegen die Abstrakte Klassen SHA256 Instanz.
Der Konstaruktor ist auch als protected markiert, da durch kannst du auch keine direkte Instanz von SHA256 erzeugen.
In der Doku zu SHA256Managed wird auch darauf hingewiesen, über Create von Base Type (SHA256) nutzen um eine Instanz zu erhalten.

Doku:
SHA256 Klasse (System.Security.Cryptography)

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

2.079 Beiträge seit 2012
vor einem Jahr

Die ist laut den Docs abstrakt. Sie hat aber trotzdem einen Konstruktor. Das verstehe ich schon nicht, denn eine abstrakte Klasse soll ja eigentlich gar keine Instanzen haben.

Sie kann doch trotzdem Initialisierungen benötigen?
Die Ableitung muss diesen Konstruktor dann eben aufrufen.
Außerdem: Jede Klasse hat einen Konstruktor, Du siehst ihn nur nicht immer, da er - wenn nicht vorhanden - automatisch ergänzt wird.

Davon abgesehen gibt es dann aber noch eine Create() Methode, die eine Instanz erstellt und zurückgibt.

Das ist das Factory-Pattern.
Ich vermute, das hat den Hintergrund, dass sie die Implementierungen dahinter ändern können, ohne dass dadurch BreakingChanges entstehen.
Einen konkreten Grund, warum sie das Factory-Pattern verwendet haben, weiß ich aber nicht.

Die Create Methode liefert eine Instanz von SHA256Managed.

Das stimmt nur so fast.
Tatsächlich liefert sie eine nested class namens "Implementation", deren Implementierung aber identisch zu SHA256Managed ist.

Was der Grund für dieses ungewöhnliche Vorgehen ist, würde mich aber auch interessieren.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

T
2.224 Beiträge seit 2008
vor einem Jahr

@Palladin
Hab ich oben bereits angepasst, war in der ersten Version noch drin.
Hab in den Source von .NET 6 und 4.8 geschaut.
In .NET 6 wird tatsächlich die nested Class geliefert.
Dort ist SHA256Managed nur auch als Obsolete markiert.
In .NET 4.8 wird noch etwas interne Magic durchgeführt bzw. über Magic Strings dann eine Instanz von SHA256Managed geliefert.

.NET 6 Implementierung
.NET 4.8 Implementierung

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

6.911 Beiträge seit 2009
vor einem Jahr

Hallo,

Einen konkreten Grund, warum sie das Factory-Pattern verwendet haben, weiß ich aber nicht. ... Was der Grund für dieses ungewöhnliche Vorgehen ist, würde mich aber auch interessieren.

Hat v.a. mit den verschiedenen Plattformen (Windows, Unix-artige, MacOs) und der Entstehungsgeschichte von .NET (Core) zu tun und da mit diesem Pattern die konkreten Implementierungen web-abstrahiert werden können. Somit war/ist es möglich auf unix-artigen System OpenSSL zu verwenden, während bei Windows deren Crypto-APIs verwendet werden. Weiters ist es somit möglich die Implementierungen zwischen managed und native zu verschieben ohne dass sich für einen Konsumenten dieser Typen etwas ändert.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"