Использование Initialized Factory и Inheritence для создания пользовательского объекта - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь создать индивидуальный объект, используя фабричный шаблон. В идеале я хочу иметь некоторый базовый объект, который может быть унаследован, но указанный объект может действовать как базовый объект, а также выполнять конкретные задачи, которые он может выполнять. Я не могу получить доступ к данным базового объекта, хотя недавно созданный объект. Я посмотрел на некоторые учебные пособия и собрал вместе то, что, по моему мнению, должно сработать, но ударил стену.

Пока я делаю это на фабрике, чтобы потом было проще тестировать. Я пытался получить доступ к FilterPanel напрямую, не делая его абстрактным, но я не уверен, что это хорошая практика кодирования.

Почему я не могу получить доступ к функциям FilterPanel?

FilterPanel

public abstract class FilterPanel {

    //Do generic stuff that all filters can do.
    public void ClickFilterButtons(){...}
}

FilterFactory

    public class FilterFactory {

    public FilterPanel CreateFilterPanel(string filterType) {

        FilterPanel filterPanel;
        switch (filterType) {

            case "invoice":
                filterPanel = new InvoiceFilter();
                break;

            case "payment":
                filterPanel = new PaymentFilter();
                break;

            default:
                throw new Exception("wrong filter!");
                break;
        }
        return filterPanel;
    }
}

public class InvoiceFilter : FilterPanel {

    //Do specific stuff only Invoice filter can do.
    public void InvoiceStuff(){...}
}

public class PaymentFilter : FilterPanel {

    //Do specific stuff only payment filter can do.
    public void PaymentStuff(){...}
}

TestFile

        [Test]
        FilterFactory filter = new FilterFactory();
        filter.CreateFilterPanel("invoice");

        //Cannot access this function in the base filter class functions.
        filter.ClickFilterButtons();

1 Ответ

0 голосов
/ 04 июля 2018

Вы, кажется, пытаетесь вызвать участника не по тому объекту.

//Create the factory
FilterFactory factory = new FilterFactory();
//Create the filter using the factory
FilterPanel filter = factory.CreateFilterPanel("invoice");
//Call the public member on the returned filter
filter.ClickFilterButtons();
//To access InvoiceFilter specific stuff you need to cast
if(filter is InvoiceFilter) {
    (filter as InvoiceFilter).InvoiceStuff();
}
...