Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Override / replacement klasy w bibliotece

Mam klasę x z metodami statycznymi Encrypt / Decrypt używanymi przez całą bibliotekę. W większości przypadków stosowanie domyślnego szyfrowania się sprawdza, są jednak sytuacje, że klient nie chce szyfrować danych.

Czy macie jakiś patent na nadpisanie / podmianę klasy / metody, która funkcjonyje w dołączanej do projektu dll?
Coś wklimacie nadpisania metody w JavaScript...
Z tego, co czytam w sieci nie za bardzo. Może w takim razie jakieś alternatywne podejście? Spotkaliście się z czymś takim?
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: Override / replacement klasy w bibliotece

To wszystko zależy od tego jak zadeklarowana jest w metoda, którą chcesz nadpisać.
Jeśli jest sealed to nic z tym nie zrobisz. Wklej tutaj deklarację metod Encrypt / Decrypt to pomyślimy jak to zrobić.
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Override / replacement klasy w bibliotece

Kwoli wyjaśnienia - biblioteka, która ma na sobie enc/dec jest napisana przeze mnie.
Jest wykorzystywana przez aplikacje www (asp.net)
Domyślnie ma implementować to, co jej wrzuciliśmy, ale widzimy potrzebę ze strony niektórych klientów do wyłączenia szyfrowania, lub jego modyfikacji.

Coś w stylu:
1. dodaję ref do projektu
2. nadpisuję metodę
3. wszystkie pozostałe metody w moim podlinkowanym dll teraz wołają mojego override'a


public static string Encrypt(string clearText, string password)
{
//make sure clearText is a string otherwise just return whatever has been passed
if (string.IsNullOrEmpty(clearText)) return clearText;

// First we need to turn the input string into a byte array.
byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);

//Get PasswordDeriveBytes
PasswordDeriveBytes pdb = GetPasswordDeriveBytes(password);

return crypto.EncryptString(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16), crypto.Algorithm.Rijndael);
}

public static string Decrypt(string cipherText, string password)
{
//make sure clearText is a string otherwise just return whatever has been passed
if (string.IsNullOrEmpty(cipherText)) return cipherText;

// First we need to turn the input string into a byte array.
// We presume that Base64 encoding was used
byte[] cipherBytes = Convert.FromBase64String(cipherText);

PasswordDeriveBytes pdb = GetPasswordDeriveBytes(password);

return crypto.DecryptString(cipherBytes, pdb.GetBytes(32), pdb.GetBytes(16), crypto.Algorithm.Rijndael);

}
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: Override / replacement klasy w bibliotece

W takim razie musisz stworzyć nową klasę dziedziczącą po tej aktualnej i nadpisać metodę:


public static override string Encrypt(string clearText, string password)
{
// nowa implementacja
}

konto usunięte

Temat: Override / replacement klasy w bibliotece

Marcin S.:
W takim razie musisz stworzyć nową klasę dziedziczącą po tej aktualnej i nadpisać metodę:

Nie da się 'override'ować' statycznych metod, ponieważ nie można ich oznaczyć jako 'virtual'. W celu nowej implementacji statycznej metody w klasie pochodnej powinieneś użyć 'new':


public new static string Encrypt(string clearText, string password)
{
}
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: Override / replacement klasy w bibliotece

Zgadza się, w przypadku metod statycznych trzeba użyć new zamiast override.
Jacek R.

Jacek R. programista

Temat: Override / replacement klasy w bibliotece

A trzeba było napisać to po ludzku, czyli bez użycia metod statycznych, za to z dependency injection. Nie byłoby teraz najmniejszego problemu, jeśli chodzi o zmiany.
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Override / replacement klasy w bibliotece

huh, się człowiek ciągle uczy.. Dzięki za wskazówkę.

Następna dyskusja:

C# - iteracja po polach klasy




Wyślij zaproszenie do