Предположим:
- Есть некоторый модуль с интерфейсом
IA
. - Есть некоторый модуль
B
, который принимает в параметре экземпляр IA
и чье поведение зависит от типа этого IA
,
значения (псевдокод, без определенного языка, [хотя я использую Python])
class B{
IA ia;
B(IA ia){
this.ia = ia;
}
doStuff(){
if(type(this.ia)==A1){
print("A1");
}
if(type(this.ia)==A2){
print("A2");
}
}
}
IПонимаю, что я мог бы добавить какой-нибудь открытый метод foo
к ia
, и, таким образом, код упростится до
class B{
IA ia;
B(IA ia){
this.ia = ia;
}
doStuff(){
this.ia.foo();
}
}
Мой вопрос состоит из двух частей:
Каков правильный дизайн для достижения этой цели, если я (по какой-то причине) не могу изменить IA
, то есть я не могу добавить foo()
?
Каков правильный (масштабируемый) дизайн, если мне разрешено изменять IA
, но теперь та же проблема повторяется для A1
, A2
и т. Д., Что означает
конечное желаемое поведение -
class B{
IA ia;
B(IA ia){
this.ia = ia;
}
doStuff(){
if(type(this.ia)==A1){
if(type(this.ia.iz)==Z1){
print("A1Z1");
print("unique treatment");
}
if(type(this.ia.iz)==Z2){
print("A1Z2");
print("special treatment");
}
}
if(type(this.ia)==A2){
if(type(this.ia.iz)==Z1){
print("Z1A2");
print("one of a kind treatment");
}
if(type(this.ia.iz)==Z2){
print("Z2A2");
print("Wow treatment");
}
}
}
}
и может повторяться несколько раз.
Обратите внимание, что Z1 и Z1 одинаковы для A1 и A2! .И снова, то же самое может продолжаться, IZ
может содержать IX
нескольких типов с уникальным поведением
Интересно, является ли случай 2 отдельным от модульного, в том смысле, что поведениеуникальный для каждой комбинации типов, и никакое поведение не может быть действительно извлечено до более абстрактного уровня.
Мне все еще не нравится проверка типов, и я задаюсь вопросом, можно ли что-то сделать, что выглядит лучше.