2013-11-14 4 views
1

У меня есть иерархия наследования с суперклассом Transaction. Я использую его как переменную в одном из моих классов, но у меня возникают проблемы с преобразованием его в определенные типы, например, GameTransaction, ScienceTransaction и т. Д.Преобразование суперкласса в определенный производный тип

Каждый конкретный тип имеет определенные атрибуты, поэтому я должен проверить, этот тип через typeof затем бросил его, так что я в конечном итоге с If.. else if.. и так далее, в зависимости от того, сколько производных классов есть для Transaction.

Это раздражает. Есть ли другой способ обойти это? Любой шаблон дизайна для этого?

+2

Звучит как проблема дизайна. Разделите свой код, который работает с обобщенным 'Transaction' из кода, который работает на' GameTransaction' и т. Д. Вызывающий более специализированный код должен знать тип транзакции, с которой он имеет дело. Конечно, трудно сказать наверняка, не видя того, чего вы пытаетесь достичь. – GriffeyDog

+1

Почему вы отметили это как 'C#', так и 'java'? Что вы используете? –

+0

Спасибо, ребята, я использую C#, но вы можете использовать java-программистов так, как минимум ..Griffey моя транзакция супер класса используется в моем классе фасада (шаблон проектирования), поэтому каждый раз существуют методы или службы, которые включают или требуют кастинга для определенного типа. Я страдаю If .. Else IF .. Else IF .... проверяя тогда кастинг для определенного типа для доступа к этому свойству или атрибута любым другим способом? – Patrick87

ответ

1

Если метод принимает параметр транзакции, поведение этого метода должно быть на этом уровне. Если этот метод использует данные, которые могут отличаться от GameTransaction, ScienceTransaction и т. Д., Эти данные должны быть доступны с помощью метода доступа на уровне транзакции. Каждая специализация может переопределить этот метод доступа и обеспечить соответствующие дополнительные данные.

+0

Спасибо Арагорн. так что вы говорите, что если у меня есть метод: MyGameMethod, специфичный для класса GameTransaction, я должен также поместить его в абстрактную транзакцию класса? поэтому, если я скажу, что 4 подкласс, наследующий от Transaction, я должен поместить все методы, специфичные для каждого класса, в базовый класс как абстрактные или виртуальные методы? would'nt, чтобы сделать базовый класс большим? как и во многих методах, некоторые из них не могут быть полезны для другого производного типа только для определенного ... как MyGameMethod .. было бы хорошо? – Patrick87

+0

@ user2080671: Нет, вы предлагаете только методы транзакции, которые применяются к * любой транзакции. Если вам нужен метод, доступный только для одного типа/подкласса транзакции, то метод должен принимать только этот подкласс. – sleske

0

Если для этого метода требуется GameTransaction, вы должны передать его GameTransaction.

Передача переменной типа Transaction и ее отличное от GameTransaction - это плохой дизайн - это трудно понять и источник ошибок программирования. Если вы случайно ошиблись, этот компилятор не сможет это определить.

Если у вас действительно есть методы, которые должны работать на транзакции любого типа (так называемые общие методы), то Transaction должен предоставить достаточную информацию для этих методов.

Например, если метод должен проверять при запуске трансации, тогда у вас должен быть такой метод, как Transaction.startTime(), а не только GameTransaction.startTime().

0

my super class transaction используется в моем классе фасада (дизайн), поэтому каждый раз есть методы или службы, которые требуют или требуют кастинга для определенного типа. Я страдаю If .. Else IF .. Else IF. ... проверка затем литье на определенный тип для доступа к этому свойству или атрибуту

да .. это была проблема при использовании фасадного рисунка. вам нужно сделать дополнительный бросок на клиентский код.

рассмотреть возможность использования Generic на вас фасад

public class Facade 
{ 
    public Transaction GetTransaction<T>() where T : Transaction 
    { 
     // any other process 
     return (T)result; 
    } 
} 

просто вызовите его на код клиента:

GameTransaction gameTx = facadeInstance.GetTransaction<GameTransaction>(); 

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

Смежные вопросы