Wpis z mikrobloga

object aaa = new object();
aaa = new string("aaa222");
Console.WriteLine(aaa.GetType());

Konsola wyświetli informację o tym, że "aaa" to string, jednak VS uznaje to za object, przez co przy wpisaniu "aaa." podpowiada metody dla object, a nie stringa. Da się to zmienić? Jak sam sobie wpiszę np aaa.Trim();, to pokazuje mi że to błąd. Chodzi mi o możliwość żeby VS sam wykrywał takie rzeczy, bez rzutowania. Nie wiem czy ma to znaczenie, ale używam VS 2019 Preview. Według strony MS to zawsze działa

Derived d = new Derived();
Base b = d; // Always OK.

Jednak denerwuje mnie że w takiej sytuacji nie mogę korzystać z metod Derived, choć typ tego objektu to właśnie Derived.

#csharp #naukaprogramowania #visualstudio
  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Goglez: zadeklarowałeś obiekt, musisz rzutować na string jak chcesz metody użyć ((string)aaa).Trim();
// edit: ok sorry nie doczytałem wszystkiego xD o widzę nie tylko ja xD
  • Odpowiedz
@Goglez: To jest tak zwane „rzutowanie w górę” i vs działa poprawnie. Możesz przypisać obiekt klasy dziecka do rodzica, ale nie masz wtedy dostępu do zmiennych i funkcji dziecka bez rzutowania. Kod napisany przez ciebie jest bez sensu, bo po co używać „Object” jak chcesz działać na stringach. Od razu stwórz zmienna jako string. Zainteresuj się tez klasami generycznymi
  • Odpowiedz
Kod napisany przez ciebie jest bez sensu


@Paitius: Bo to przykład mający pokazać o co mi chodzi.
Mam metodę która zwraca interfejs IBuilder, który implementują różne IConcreteBuildery, które są implementowane już przez jakieś konkretne klasy ConreteBuilder (np UserBuilder) i nie wiem jak się dobrać do tych IConcreteBuilderów, liczyłem że będę mógł używać jednej generycznej metody która będzie mi zwracać odpowiedni builder na podstawie T (np var concreteBuilder = _builder.GetBuilder();,
  • Odpowiedz
liczyłem że będę mógł używać jednej generycznej metody która będzie mi zwracać odpowiedni builder na podstawie T


@Goglez: możesz sobie taką napisać, nawet jako ExtensionMethod, to będzie ładnie wyglądało. Poza tym, te "różne" buildery mogą implementować przecież jeden wspólny interfejs.
  • Odpowiedz
@piepies: Nie mam na myśli że GetBuilder() zwróci mi T, tylko TBuilder. Gdybym miał GetBuilder czy IBuilder to sprawa jest prosta, ale ja chcę żeby mi dla np Usera zwróciło UserBuildera, czyli w przypadku var builder = GetBuilder(); zmienna builder będzie UserBuilderem (czy też IUserBuilderem); chyba że źle Cie zrozumiałem, to będę wdzięczny za przykład, co jest możliwe bo nie wiem w jaki sposób ExtensionMethod miałoby mi pomóc w tym
  • Odpowiedz
w jakiejś metodzie


@piepies: Która co zwraca? To z tym mam problem, jedna metoda, która zwraca różne implementacje jednego interfejsu. Zwraca to co chcę, ale opakowane w typ bazowy, który nie ma wszystkich metod które chce.
  • Odpowiedz
@Goglez czyli same buildery mają różne metody? Bo jeśli wszystkie mają dajmy 1 metodę Build to możesz dać im generyczny interfejs IBuilder w którym jest generyczna metoda zwracająca to co budujesz Build.
A jeśli wszystkie buildery mają różne metody to już w trakcie pisania kodu i tak musisz wiedzieć co konkretnie budujesz i właściwie generyczne podejście nie jest potrzebne ani możliwe, zamiast GetBuilder wystarczy GetUserBuilder.
Ale nie wiem jaką dokładnie masz
  • Odpowiedz