[C#] gebruiken van abstracte classes

Pagina: 1
Acties:

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
In de classes bibliotheek van het .NET framework zitten nogal wat abstracte classes en daarin beveiligde constructors, waarvan ik er een wil gebruiken. Nu zit ik met het probleem dat ik er na een middag actief googlen en msdnen nog niet uit ben gekomen hoe ik die moet implementeren.
Ik weet alleen dat het waarschijnlijk met ongeveer het volgende moet gaan gebeuren:
code:
1
2
3
4
class Test : HashAlgorithm
{
  // en hier??
}

Het gaat hier dus om de namespace System.Security.Cryptography en de class HashAlgorithm

Verwijderd

Definitie van abstract class: geen implementatie, alleen overridable methods (die je MOET implementeren anders is de class die je derived van de abstract class ook abstract).

de class 'HashAlgorithm' is abstract, heeft dus geen implementatie. Je moet dus in je derived class alle methods van HashAlgorithm implementeren. Net als interfaces dus.

Aanbevolen literatuur: Programming C# by Jesse Liberty (O' Reilly)

  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Op dinsdag 05 maart 2002 16:29 schreef Otis het volgende:
Definitie van abstract class: geen implementatie, alleen overridable methods (die je MOET implementeren anders is de class die je derived van de abstract class ook abstract).
Bij C++ is het wel degelijk mogelijk om een abstracte klasse (dus alle methoden virtual bla() = 0) een implementatie te geven. Je bent echter nog steeds verplicht om alle methoden te overriden, maar je kunt de basis-implementatie aanroepen door rechtstreeks de methode in de basisklasse aan te spreken: CMyBase.bla()

Geen idee hoe dat bij C# zit.

Motor-forum.nl


  • whoami
  • Registratie: December 2000
  • Nu online
Op dinsdag 05 maart 2002 16:22 schreef Limhes het volgende:
In de classes bibliotheek van het .NET framework zitten nogal wat abstracte classes en daarin beveiligde constructors, waarvan ik er een wil gebruiken. Nu zit ik met het probleem dat ik er na een middag actief googlen en msdnen nog niet uit ben gekomen hoe ik die moet implementeren.
Ik weet alleen dat het waarschijnlijk met ongeveer het volgende moet gaan gebeuren:
code:
1
2
3
4
class Test : HashAlgorithm
{
  // en hier??
}

Het gaat hier dus om de namespace System.Security.Cryptography en de class HashAlgorithm
De methods die in de class HashAlgorithm als abstract gedefinieerd staan moet je gaan overriden, dwz, uw eigen implementatie daaraan geven. De methods die in die class als virtual staan kun je ook gaan overriden maar dat is niet verplicht.

Een functie overriden doe je als volgt:
code:
1
2
3
4
5
6
7
8
9
class Test : HashAlgorithm
{

  public override AbstracteFunctieInHashAlgorithm()
  {
    // bla.
  }

}

https://fgheysels.github.io/


  • ErectionJackson
  • Registratie: April 2000
  • Laatst online: 23-06-2017

ErectionJackson

Ff testen hoe lang een onderti

En je moet dus alle functies overriden? Wat gebeurt er als je dat niet doet dan?

Microsoft SharePoint oplossingen | www.onlinesamenwerken.nl | Persian Dance Helia


Verwijderd

Op dinsdag 05 maart 2002 16:35 schreef Bananeman2002 het volgende:
Bij C++ is het wel degelijk mogelijk om een abstracte klasse (dus alle methoden virtual bla() = 0) een implementatie te geven. Je bent echter nog steeds verplicht om alle methoden te overriden, maar je kunt de basis-implementatie aanroepen door rechtstreeks de methode in de basisklasse aan te spreken: CMyBase.bla()
Klopt. Maar in C# heb je geen implementatie van abstract methods.

  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Op dinsdag 05 maart 2002 18:49 schreef Otis het volgende:

[..]

Klopt. Maar in C# heb je geen implementatie van abstract methods.
Ok, thanks, handig om te weten. Ik wou me toch eens wat (meer) gaan bezighouden met C#, en dit zijn zaken die ik dan weer interessant vind. :)

Motor-forum.nl


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
Dankjewel allemaal, maar nu ik alles zo goed als werkend heb, krijg ik de leuke melding test.cs(131,5): error CS0122: 'System.Security.Cryptography.HashAlgorithm.HashCore(byte[], int, int)' is inaccessible due to its protection level
test.cs(132,23): error CS0122: 'System.Security.Cryptography.HashAlgorithm.HashFinal()' is inaccessible due to its protection level


code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Crypt : HashAlgorithm
{
  public override void Initialize() {}
  protected override void HashCore(byte[] bArray, int iBegin, int iLength) {}
  protected override byte[] HashFinal() {}
}

class Test
{
  static void Main()
  {
    Crypt md5 = new Crypt();
    md5.Initialize();
    md5.HashCore(bToMD5, 0, bToMD5.Length);
    byte[] bFromMD5 = md5.HashFinal();
  }
}

ipv 'protected' 'public' er neerzetten werkt ook niet...
Help!

  • tomato
  • Registratie: November 1999
  • Niet online
ErectionJackson: En je moet dus alle functies overriden? Wat gebeurt er als je dat niet doet dan?
Alleen abstract methods hoef je te overriden. Als je dat niet doet krijg je opnieuw een abstract class (geen implementatie).

  • tomato
  • Registratie: November 1999
  • Niet online
Limhes: Dankjewel allemaal, maar nu ik alles zo goed als werkend heb, krijg ik de leuke melding
code:
1
2
3
4
[..]
.HashCore(byte[], int, int)' is inaccessible due to its protection level
.HashFinal()' is inaccessible due to its protection level
[..]
Dat klopt, want je methods die je wilt gebruiken zijn protected, ze zijn dus alleen toegankelijk vanuit de class zelf (wellicht wat kort door de bocht, ik weet uit mijn hoofd niet exact hoe het in C# met access modifiers werkt) en niet daarbuiten.
ipv 'protected' 'public' er neerzetten werkt ook niet...
Help!
Dat klopt. De methods zijn in de abstract class protected en dat kun je bij overriden niet veranderen.

Wat je wel kunt doen is een simpele public wrapperfunctie maken, maar of je dat wilt vanuit 'good design (tm)' oogpunt is een ander verhaal...

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
Wat je wel kunt doen is een simpele public wrapperfunctie maken, maar of je dat wilt vanuit 'good design (tm)' oogpunt is een ander verhaal...
Good design of niet, ik wil 't wel eens aan 't werken hebben... Google vindt alleen Java zooi en kweet niet hoeveel dat compatible is, dus hoe zou ik zoiets moeten maken?

  • tomato
  • Registratie: November 1999
  • Niet online
Limhes: Good design of niet, ik wil 't wel eens aan 't werken hebben... Google vindt alleen Java zooi en kweet niet hoeveel dat compatible is, dus hoe zou ik zoiets moeten maken?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Crypt : HashAlgorithm {

   public override void Initialize () {
   }

   protected override void HashCore (byte[] bArray, int iBegin, int iLength) {
   }

   protected override byte[] HashFinal () {
   }

   public void setHashCore (byte[] bArray, int iBegin, int iLength) {
    HashCore (bArray, iBegin, iLength);
   }

   public byte[] getHashFinal () {
    return HashFinal ();
   }

}

Ik heb geen idee wat je allemaal precies wilt gaan doen hiermee, maar vrijwel zeker lijkt me dit geen mooie oplossing. Maar goed :)
Pagina: 1