Я ищу шаблон для следующего. (Я работаю в Perl, но не думаю, что язык имеет особое значение).
с родительским классом Foo и детьми Bar, Baz, Bazza.
Одним из методов построения Foo является синтаксический анализ строки, и часть этой строки будет неявно указывать, какой класс должен быть создан. Так, например, если он запускает «http:», то это Bar, но если он этого не делает, но содержит «[Date]», то Baz это нравится, и так далее.
Теперь, если Foo знает обо всех своих дочерних элементах и о том, какая строка является Bar, что такое Baz и т. Д., Он может вызвать соответствующий конструктор. Но базовый класс не должен иметь никаких знаний о своих детях.
Я хочу, чтобы конструктор Фу мог по очереди испытывать своих детей, пока один из них не скажет: «Да, это мое, я создам вещь».
Я понимаю, что в общем случае эта проблема не является четко определенной, поскольку может быть несколько дочерних элементов, которые примут строку, и поэтому порядок, в котором они называются, имеет значение: игнорируйте это и предполагайте, что характеристики строки таковы, что строка может понравиться только одному дочернему классу.
Лучшее, что я придумал, - это чтобы дочерние классы «регистрировались» в базовом классе при инициализации, чтобы он получал список конструкторов и затем проходил через них. Но есть ли лучший метод, который мне не хватает?
Пример кода:
package Foo;
my @children;
sub _registerChild
{
push @children, shift();
}
sub newFromString
{
my $string = shift;
foreach (@children) {
my $object = $_->newFromString(@_) and return $object;
}
return undef;
}
package Bar;
our @ISA = ('Foo');
Foo::_registerChild(__PACKAGE__);
sub newFromString
{
my $string = shift;
if ($string =~ /^http:/i) {
return bless(...);
}
return undef;
}