Приведение одного объекта к другому - PullRequest
2 голосов
/ 04 сентября 2010

Я должен к классам.скажем Invoice и TempInvoice.Оба имеют одинаковые свойства (все одинаковы).допустим, я создал объект с использованием класса Invoice.Могу ли я привести этот объект к другому объекту, который я создал с помощью tempInvoice ??

ex:

Invoice invoiceobj= getInvoice(int? id) //a method return a invoice object

TempInvoice tempInvoiceObject = invoiceobj// (Need to do it and fill tempInvoice by Invoice Values.even as a new memory location o set by reference.)

Ответы [ 6 ]

4 голосов
/ 04 сентября 2010

Нет, если Invoice не получено из TempInvoice.

3 голосов
/ 04 сентября 2010

+ 1 к Марсело.TempInvoice должен быть базовым классом Invoice для этого.

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

2 голосов
/ 04 сентября 2010

Если классы абсолютно одинаковы, зачем использовать 2 класса? Я думаю, что у вас есть проблема дизайна здесь. Используйте класс Invoice для нескольких экземпляров, и все будет в порядке.

Если вам абсолютно необходимо использовать 2 разных класса, то сделайте TempInvoice подклассом Invoice, и вы сможете разыграть. Но я не думаю, что в этом есть смысл.

1 голос
/ 04 сентября 2010

Вы не упомянули, какой язык вы используете, но поскольку концепция почти одинакова для всех языков ООП, на данный момент я буду использовать C #.

Единственный способ сделать этонеявное преобразование, подобное тому, которое вы указали в вашем примере, это если Invoice является подклассом TempInvoice, например, так:

public class Invoice : TemplInvoice { }

Однако вы можете выполнить явное преобразование, если обратное верно (т.е. TempInvoice является производным от Invoice), но только если метод getInvoice действительно создает объект TempInvoice или объект, производный от TempInvoice.В противном случае вы получите InvalidCastException при попытке выполнить явное преобразование.Имейте в виду, что только платформы, такие как Java или Microsoft.NET, будут вызывать приятное, чистое исключение для вас.Вещи могут стать намного более неприятными из языков, таких как C или C ++, поскольку они позволят вам выполнять такие вещи, как слепое приведение без особых предупреждений (static_cast и dynamic_cast не смогут скомпилироваться), что часто приводит к получению либо мусорных данных (в лучшем случае)или нарушение доступа (наихудший случай) в случайных точках кода ниже.

Если вам абсолютно необходимо иметь два объекта, вероятно, лучше всего либо извлечь один из другого, либо разбитьиз общих методов в отдельный базовый класс, который оба могут наследовать.Тем не менее, вы никогда не должны слепо понижать значение возврата из вызова функции.Если у вас есть случай, когда вы знаете, что функция всегда будет возвращать один и тот же тип, вы должны использовать этот тип напрямую и, во всяком случае, избегать принижения.Это безопаснее и эффективнее для сгенерированного кода.Если вы используете фабричный шаблон, вы можете встроить некоторую форму RTTI в базовый интерфейс, чтобы вы не делали (в основном) слепое бросание.Хорошим примером этого (немного сложнее) является метод QueryInterface для COM-объектов, но вы можете сделать что-то такое же простое, как добавление свойства Invoice.Type.

1 голос
/ 04 сентября 2010

То, что вы могли бы рассмотреть также это:

  • Создать интерфейс, например, IInvoice и объявите в нем все общие свойства и методы из Invoice и TempInvoice.

  • И Invoice, и TempInvoice должны реализовать этот интерфейс.

После этого вы по-прежнему не можете преобразовать объект Invoice в TempInvoice (если только первый тип не является производным от последнего), , но , вы можете преобразовать любой тип объекта в IInvoice.

1 голос
/ 04 сентября 2010

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

Таким образом, если TempInvoice создается следующим образом:

public class TempInvoice : Invoice
{
}

, тогда он будет работать.1008 * Если это два не связанных между собой класса, то нет, вы не можете.

Однако зачем вам в этом случае два отдельных класса?Вы можете просто иметь два объекта одного класса, учитывая, что вы утверждаете, что все свойства одинаковы:

Invoice invoiceobj= getInvoice(int? id) //a method return a invoice object

Invoice tempInvoiceObject = invoiceobj;
...