У меня есть абстрактный базовый класс, TestFactory
который выглядит как:Передача перечислений в качестве параметра из абстрактного класса
public abstract class TestFactory
{
//static method that can create concrete factories
public static TestFactory CreateTestFactory(FactoryType factoryType)
{
TestFactory factory = null;
switch (factoryType)
{
case FactoryType.Blood:
factory = new BloodTestFactory();
break;
case FactoryType.Urine:
factory = new UrineTestFactory();
break;
default:
break;
}
return factory;
}
//BloodTestFactory and UrineTestFactory are concrete types
//that will need to create their own tests
//this enum parameter needs to 'switch' between
//BloodTestType and UrineTestType
public abstract LabTest CreateTest(Enum e);
}
public enum FactoryType
{
Blood,Urine
}
Так что этот класс создает бетонный завод, как:
public class BloodTestFactory :TestFactory
{
//both BloodTestFactory and UrineTestFactory will create a LabTest object
//I would like to have a BloodTestType and UrineTestType enum, what do I need
//to do to pass a generic Enum as a parameter and then switch on BloodTestType
public override LabTest CreateTest(Enum e)
{
BloodTest bt = null;
//switch (e)
//{
// default:
// break;
//}
//creation logic here
}
}
public enum BloodTestType
{
H1AC,Glucose
}
BloodTest
сам по себе является абстрактный класс, который вернет конкретный объект BloodTest
на основе значения Enum. Для ясности я хотел бы иметь список BloodTestType
и UrineTestType
(не показан). Поскольку метод CreateTest
является абстрактным, как я могу удостовериться, что могу передать ему BloodTestType
, когда хочу создать BloodTest
s и перечислить UrineTestType
, когда я хочу создать UrineTest?
Разве вы не можете просто конвертировать родовое '' Enum e'' в бетон '' BloodTestType'' внутри '' метода CreateTest''? – Kippie
@ Сильверминд, что было бы проще всего сделать. Мне было просто любопытно, есть ли более «элегантный» способ сделать это. Я знаю, что перечисления не наследуют, но я думал, что может быть что-то в этом роде. Не то, чтобы вы могли знать, но на самом деле последние из перечислений, которые могут потребоваться, могут быть довольно большими. – wootscootinboogie
Чем больше я смотрю на этот вопрос, тем больше я думаю, что ваша архитектура просто ошибается. Вы пытаетесь сделать переключатель на перечислении, чтобы определить, какой тест выполнить, но вся точка шаблонов, например Factory factory/abstract factory, заключается в том, чтобы удалить такую логику ветвления из вашего кода. Таким образом, вы получите классы «GlucoseBloodLabTest», «H1ACBloodLabTest», «SomeUrineLabTest» и т. Д., Все наследуемые от базового класса «LabTest». Если вы хотите узнать, как изменить свой код, чтобы сделать это другим способом, отправьте сюда, и я буду работать над отдельным ответом для вас. – Jamiec