Konstruktory z argumentami dla klas generycznych

0

Witam,

w jaki sposób można używać konstruktora z argumentami w klasach generycznych?
W przykładzie użyłem "core = new T();", lecz czy można używać konstruktorów z parametrami?

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace mytlib
{
  public class Cr
  {
    public string a;
    public Cr(string a)
    {
      this.a = a;
    }
  }

  public class Bass<T> where T : Cr, new()
  {
    private T core;

    public Bass()
    {
      core = new T();
      Show();
    }
    public void Show()
    {
      Console.WriteLine(core.a);
    }
  }
}
0

Po co ci typy generyczne skoro chcesz przechowywać w tym polu tylko jeden typ (ew. dziedziczone po nim)?

0

Zapomniałem dodać, że jest to tylko szkic problemu.
Docelowa klasa jest o wiele większa i ma o wiele więcej zastosowań.

0

Nakreśl swój problem bardziej dokładnie, bo ja nie rozumiem o co Ci chodzi/w czym problem.

0
somekind napisał(a)

Nakreśl swój problem bardziej dokładnie, bo ja nie rozumiem o co Ci chodzi/w czym problem.

W klasie class Bass<T> posiadam konstruktor, który tworzy m.in. obiekt klasy generycznej T.
W przypadku wywołałem konstruktor bezparametrowy do tworzenia tego obiektu (new T()).
Pytanie: Czy można używać (jak) konstruktorów z argumentami do tworzenia obiektów klasy generycznej?

0

Klasą generyczną u Ciebie jest Bass<T>. Ty pytasz o T? Czyli o parametr generyczny.
Chyba się nie da zrobić tego, co chcesz (no chyba, że przez refleksję). Nie jestem pewien, nigdy nie próbowałem uskuteczniać takiej magii. Myślę, że chcesz coś osiągnąć okrężną drogą, przemyśl swój pomysł. Może lepiej w konstruktorze Bass przekazywać już utworzony obiekt T?

0

Nie da się zrobić tego, co chcesz zrobić. Nie ma "constraint"-a dla konstruktorów z parametrem.

0
    public class Cr
    {
        public string a;
        public Cr(string a)
        {
            this.a = a;
        }
    }

    public class Bass<T> where T : Cr
    {
        private T core;

        public Bass(object argument)
        {
            core = Activator.CreateInstance(typeof(T),argument) as T;
            Show();
        }
        public void Show()
        {
            Console.WriteLine(core.a);
        }
    } 

...
        static void Main(string[] args)
        {
            new Bass<Cr>("Argument");

            Console.ReadKey();
        }


0

stworz sobie mechanizmy w oparciu o wzorzec factory, do tworzenia instancji odpowiednich typow
lub wymus aby implementowaly jakis interfejs inicjujacy obiekt

0

Fabryki to fajne rozwiązanie, ja chciałem tylko pokazać ze się da i to całkiem prosto.

Przykładowo możesz mieć repozytorium fabryk w postaci jakiegoś singletonu( w środku dictionary po type) i wybierać fabryke podając typeof(T).

Inna sprawa, tak jak mówił SomeKind, może da się przekazać do Bass już stworzony obiekt typu T... Do przemyślenia

1 użytkowników online, w tym zalogowanych: 0, gości: 1