Mam klasy, która obecnie ma kilka metod, które biorą parametry liczb całkowitych. Te liczby całkowite są odwzorowywane na operacje, które może wykonywać aplikacja. Chciałbym uczynić klasą rodzajową, aby konsumenci klasy mogli podać typ wyliczeniowy, który mają ze wszystkimi operacjami w nim zawartymi, wtedy metody przyjmą parametry tego typu wyliczeniowego. Jednak chcę, aby nie byli w stanie określić typu ogólnego w ogóle i domyślnie powrócić do liczb całkowitych bez zmiany składni z obecnego sposobu. czy to możliwe?Jak podać typ domyślny dla generycznych?
Odpowiedz
Nie można tego zrobić w definicji klasy:
var foo = new MyGenericClass(); // defaults to integer... this doesn't work
var bar = new MyGenericClass<MyEnum>(); // T is a MyEnum
Jeśli naprawdę cenimy implicitness domyślnego typu int samopoczucia, trzeba to zrobić ze statycznym fabryce metoda, chociaż nie widzę jej wartości.
public class MyGenericClass<T>
{
public static MyGenericClass<T> Create()
{
return new MyGenericClass<T>();
}
public static MyGenericClass<int> CreateDefault()
{
return new MyGenericClass<int>();
}
}
Zobacz poniżej, jak naprawdę nie korzystasz z powyższych.
var foo = MyGenericClass<MyEnum>.Create();
var bar1 = MyGenericClass.CreateDefault(); // doesn't work
var bar2 = MyGenericClass<int>.CreateDefault(); // works, but what's the point
Jeśli chcesz wziąć go jeszcze dalej, można utworzyć statyczną klasy fabrycznej, że rozwiąże to, ale to jeszcze bardziej absurdalne rozwiązanie jeśli robisz to dla żadnego innego powodu niż dostarczenie domyślne wpisz:
public static class MyGenericClassFactory
{
public static MyGenericClass<T> Create<T>()
{
return new MyGenericClass<T>();
}
public static MyGenericClass<int> Create()
{
return new MyGenericClass<int>();
}
}
var foo = MyGenericClassFactory.Create(); // now we have an int definition
var bar = MyGenericClassFactory.Create<MyEnum>();
tak, nie chcę wprowadzać tej złożoności, domyślnie nie jest to niezwykle ważne, byłoby po prostu miłe. Nie wiem, jak to zrobić, ale najpierw chciałem się upewnić, że wszyscy z was to zrobią.Dziękuję za odpowiedź –
Kompilator można wywnioskować argumentów typu na metod większość czasu w zależności od typu argumentów przekazany:
public void DoSomething<T>(T test) {
}
można nazwać z
DoSomething(4); // = DoSomething<int>(4);
DoSomething(MyEnum.SomeValue); // = DoSomething<MyEnum>(MyEnum.SomeValue);
Nawiasem mówiąc, możesz mieć nietypowe przeciążenia metody ogólnej.
Poszukuję klasy, która będzie w pewnym sensie "opcjonalnie ogólna". Nie sądzę, że jest to możliwe, więc będę musiał zrobić ogólne metody z nietypowymi przeciążeniami ... Szukałem tego "SecurityContext sec = new SecurityContext();" (który utworzyłby go przy użyciu liczb całkowitych dla parametrów, a następnie "SecurityContext
Zachowaj oryginalną wersję (wersja nietypowa) i utwórz jej ogólną wersję.
Następnie wywołaj wersję ogólną ze swojej wersji generycznej.
void Main()
{
DoSomething(2);
DoSomething(EnumValue);
}
public void DoSomething(int test) {
DoSomething<int>(test);
}
// Define other methods and classes here
public void DoSomething<T>(T test) {
Console.WriteLine(test);
}
Ogólny typ parametru będzie taki sam dla wszystkich metod, więc Chciałbym to na poziomie klasy. Wiem, że mógłbym stworzyć wersję generyczną, a następnie odziedziczyć po niej wersję int, ale miałem nadzieję, że wszystko to w jednym ... ale nie znałem żadnego sposobu Myślę, że nie jest to możliwe w tak prosty sposób, jak miałem nadzieję, –
A więc ... czemu nie użyć prostego dziedziczenia? Jak:
class MyGenericClass<T>
{
}
class MyGenericClass : MyGenericClass<int>
{
}
ten sposób można napisać w obie strony:
var X = new MyGenericClass<string>();
var Y = new MyGenericClass(); // Is now MyGenericClass<int>
- 1. Casting generycznych i generycznych typ
- 2. Compiler-wywnioskować typ dla lambdas generycznych
- 3. Jak zmienić domyślny typ dla deserializacji liczbowej?
- 4. Nginx domyślny typ zawartości
- 5. Pass Typ funkcjonować generycznych i porównać
- 6. Jak definiować ograniczenia dla wielu parametrów generycznych
- 7. Operator jak i klas generycznych
- 8. Jaki jest domyślny typ metody żądania dla odwzorowania żądania?
- 9. Czy można podać typ daty dla daty, akceptując 13 jako miesiąc i 30 dla wszystkich miesięcy?
- 10. Jak zmienić domyślny edytor dla Git
- 11. Google Maps API - domyślny typ kursora
- 12. domyślny typ używany przez jsonpath jayway?
- 13. Czy GHCi może mi podać typ lokalnej funkcji Haskella?
- 14. Typ surowy. Odniesienia do typów generycznych powinny być programowane
- 15. Wysublimowany tekst 2 - domyślny typ dokumentu
- 16. Czy istnieje domyślny typ polimorficzny jednostki haskell
- 17. Ogólna lista składników generycznych
- 18. Jak podać element zastępczy?
- 19. Jak podać "* /" w JavaDocs
- 20. Jak zaimplementować wyliczanie za pomocą generycznych?
- 21. instancji generycznych za
- 22. JSON kolekcji generycznych deserializacjia
- 23. Czy musimy podać "nie puste" dla klucza podstawowego? Oracle/SQL
- 24. Jak porównać typy przy użyciu generycznych?
- 25. Stwórz listę leków generycznych
- 26. Jak zrobić przycisk opcji "Inne - proszę podać?"
- 27. emacs: jak ustawić domyślny typ bazy danych dla pliku sql w trybie SQL
- 28. jak zmienić domyślny rozmiar czcionki dla graphviz?
- 29. Jak zmienić domyślny język dla SQL Server?
- 30. Jak ustawić domyślny projekt dla SBT
nie jest @ Vilx- rozwiązanie dobre podejście i lepszą odpowiedź? –