2010-11-17 2 views
1

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

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

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

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

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

class Zebra : Animal{ 
//some code here 
} 

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

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

ответ

5

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

+0

+1: Узор завод, вероятно, является лучшим решением здесь, не имея кода заранее знать, какой тип животного он извлекает. – NotMe

+0

Всегда удивлялся, что заводы сделали ;-) Звучит многообещающе. Теперь посмотрим. –

+0

Похож на то, что мне нужно. Благодаря! –

0

Я думаю, что это нормально:

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()); 
} 
+0

Вы уверены, что работает? Это то, что я пробовал, и у него ничего не было, - жаловался на то, что не смог отправить Animal Zebra (IRIC). –

+0

Это прекрасно работает. Для простоты я изменил строку параметра на тип строки. –

1

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

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

это не подкласс, но Zebra не является подклассом Animal, он просто реализует интерфейс. Хотя я думаю, что это сработает для ОП, я не думаю, что это действительно отвечает на вопрос. –

+0

Спасибо, что указали это. Я неправильно оцениваю класс Zebra и Elephant, который должен, естественно, наследовать Animal. Обновлен мой ответ. – Jocke

+0

Хм, я сейчас смущен. –