Zastąpienie czymś innym takiego kodu

1

Hej, zastanawiam się nad alternatywą dla takiego czegoś:

List<string> nazwy = new List<string>();
nazwy.Add("jeden");
nazwy.Add("dwa");
//....

//gdzies indziej 
object obj;
if(selected == nazwy[0].toString()) obj = new Pierwszy();
if(selected == nazwy[1].toString()) obj = new Drugi();
 

Chcę mieć klasę odpowiedzialną za tworzenie odpowiednich obiektów w zależności od tego co zostało "gdzieś tam" wybrane
Jaka jest alternatywa dla wpisywania takich ifów z palca, switch nie wiele zmienia, czy to czego szukam to "fabryki"?

1

Właściwie to tak, w C++ to da się zrobić bez fabryki.
Generalnie pomysł - zamiast listy masz mapę lub listę struktur { string napis ; object obj; }:
"pierwszy" - > new Pierwszy()
"drugi" -> new Drugi()
itp.
W mapie wyszukujesz odpowiedni klucz i odpalasz funkcję wirtualną obj.clone().

4

Najprostszy przykład:

using System;
using System.Collections.Generic;

namespace ConsoleApplication
{
    class Program
    {
        static Dictionary<string, Type> dict = new Dictionary<string, Type>
        {
            { "a", typeof(Pierwsza) },
            { "b", typeof(Druga) },
        };

        static void Main(string[] args)
        {
            Console.WriteLine("a czy b?");
            string was = Console.ReadLine();

            object o = Activator.CreateInstance(dict[was]);

            Console.WriteLine(o.GetType()); // dowód, że dobrze się stworzyło
            Console.ReadLine();
        }
    }

    class Pierwsza
    {
    }

    class Druga
    {
    }
}

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