Как создать правильный подкласс на основе значения в строке SQL - PullRequest
1 голос
/ 17 ноября 2010

Я чувствовал себя довольно умно, когда я работал над созданием подклассов в C # для проекта ASP.NET, а затем обнаружил проблему - я не знал, как создать объект нужного подкласса на основе результатовSQL-запрос.

Допустим, у вас есть класс с именем Animal и два подкласса с именами Zebra и Elephant.Вы поняли идею?

Что я хочу сделать, это выполнить SQL-запрос, и если возвращаемая строка имеет row ["Type"] = "Zebra", то загрузить объект Zebra (или, если это Слон, тогда.).

Итак, в принципе у класса Animal должен быть статический метод:

class Animal{
 public static Animal Load(DataRow row){
  if (row["Type"]=="Zebra"){
   return new Zebra();
  } 
}

class Zebra : Animal{
 //some code here
}

Возможно ли это вообще, или я просто неправильно понял идею подклассов.Должно быть очевидно, что я не специалист по ОО.

Заранее спасибо, Джейк

Ответы [ 3 ]

5 голосов
/ 17 ноября 2010

Вы можете реализовать метод фабричного шаблона.http://en.wikipedia.org/wiki/Factory_method_pattern

1 голос
/ 17 ноября 2010

Попробуйте это:

    public interface IAnimal
{ }

public class Animal : IAnimal
{
    public static IAnimal Load(String type)
    {
        IAnimal animal = null;
        switch (type)
        {
            case "Zebra" :
                animal = new Zebra();
                break;
            case "Elephant" :
                animal = new Elephant();
                break;
            default:
                throw new Exception();

        }

        return animal;
    }
}

public class Zebra : Animal
{
    public int NrOfStripes { get; set; }

    public static Zebra ZebraFactory()
    {
        return new Zebra();
    }
}

public class Elephant : Animal
{
    public int LengthOfTrunk { get; set; }
}

И попробовать это:

    class Program
{
    static void Main(string[] args)
    {
        IAnimal zebra = Animal.Load("Zebra");
        IAnimal elephant = Animal.Load("Elephant");
    }
}
0 голосов
/ 17 ноября 2010

Я думаю, что все в порядке:

public class Animal
{
    public static Animal Load(string row)
    {
        if (row == "Zebra")
        {
            return new Zebra();
        }
        else if (row == "Elephant")
        {
            return new Elephant();
        }

        return null;
    }
}

public class Zebra : Animal
{
    public new string ToString()
    {
        return "Zebra";
    }
}

public class Elephant : Animal
{
    public new string ToString()
    {
        return "Elephant";
    }
}

static void Main(string[] args)
{
    Animal a1 = Animal.Load("Zebra");
    System.Console.WriteLine(((Zebra)a1).ToString());

    System.Console.WriteLine(((Elephant)a1).ToString()); // Exception

    Animal a2 = Animal.Load("Elephant");
    System.Console.WriteLine(a2.ToString());
}
...