Как через основной класс выйти на наследуемые? - C#
Формулировка задачи:
Есть класс
charect
У него есть 3 наследуемых классаZ
ombie,H
uman,G
host Дан текстовой файл с набором буквZ H I
в котором нужно определить в List<> только класс зомби и призрака. Сам текстовый фай я уже разобрал поchar[]
. Теперь осталось методом перебора понять что такое призрак, а что такое зомби и естественно человек. Код должен остаться пластичным, если будет добавлен новый персонаж, то код и его сможет отделить. Как я понял можно работать через charect, но я никак не могу додумать алгоритм перебора классов наследников.
Так же, каждый из "персонажей" имеет переменную char по которой его и можно в тексте отличить от других.
Решение задачи: «Как через основной класс выйти на наследуемые?»
textual
Листинг программы
using System;
using System.Collections.Generic;
namespace Cyberforum
{
class Program
{
static void Main(string[] args)
{
string input = "HZZHHHGZG";
List<Character> characters = new List<Character>();
foreach (char c in input)
{
if (Character.ValidKey(c))
{
Character newCharacter = Character.Instantiate(c);
characters.Add(newCharacter);
}
}
Console.WriteLine(String.Join("\n", characters));
}
}
abstract class Character
{
protected string Name;
protected int Health;
public abstract bool HasBrains();
#region Static members
public static Character Instantiate(char key)
{
var T = _map[key];
return (Character)Activator.CreateInstance(T);
}
public static bool ValidKey(char key) { return _map.ContainsKey(key); }
private static Dictionary<char, Type> _map = new Dictionary<char, Type>()
{
{ 'G', typeof(Ghost) },
{ 'Z', typeof(Zombie) },
};
#endregion Static members
}
class Zombie : Character
{
public override bool HasBrains() { return false; }
public Zombie()
{
Name = "Rob";
Health = 40;
}
private new static Character Instantiate(char key) { throw new NotImplementedException(); }
}
class Human : Character
{
public override bool HasBrains() { return true; }
public Human()
{
Name = "John";
Health = 100;
}
}
class Ghost : Character
{
public override bool HasBrains() { return false; }
public Ghost()
{
Name = "Casper";
Health = 0;
}
}
}