将一个对象转换为另一个对象

时间:2010-09-04 10:58:44

标签: c# casting class-design

我必须上课。让我们说Invoice和TempInvoice。 两者都具有相同的属性(都是相同的)。假设我使用Invoice Class创建了一个对象。我可以将该对象转换为我使用tempInvoice创建的另一个对象吗?

例如:

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 个答案:

答案 0 :(得分:4)

除非Invoice来自TempInvoice

答案 1 :(得分:3)

+1到Marcelo。 TempInvoice必须是Invoice的基类才能执行此操作。

或者你可以创建一个可以进行转换的operator implicit - 但是你仍然需要手工编写代码才能从一个代码转换为另一个代码。

答案 2 :(得分:2)

如果类完全相同,为什么要使用2个类?我觉得你这里有设计问题。对多个实例使用Invoice类,你会没事的。

如果您绝对需要使用2个不同的类,那么将TempInvoice作为Invoice的子类,您就可以进行投射了。但我不认为它真的有意义。

答案 3 :(得分:1)

如果它们相关,您只能将一个对象强制转换为另一个对象。

所以如果TempInvoice创建如下:

public class TempInvoice : Invoice
{
}

然后它会起作用。

如果他们是两个不相关的课程,那么你就不能。

但是,为什么在这种情况下你需要两个单独的类?您可以简单地拥有同一类的两个对象,前提是您声明所有属性都相同:

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

Invoice tempInvoiceObject = invoiceobj;

答案 4 :(得分:1)

您可以考虑的是:

  • 创建一个界面,例如IInvoice,并声明其中InvoiceTempInvoice的所有常用属性和方法。

  • InvoiceTempInvoice都实现此界面。

完成此操作后,您仍无法将Invoice对象转换为TempInvoice(除非前者类型来自后者),您可以转换任一对象类型到IInvoice

答案 5 :(得分:1)

你没有提到你正在使用哪种语言,但由于所有OOP语言的概念几乎相同,我现在假设C#。

你可以进行隐式转换的唯一方法,就像你在你的例子中所做的那样,如果Invoice是TempInvoice的子类,就像这样:

public class Invoice : TemplInvoice { }

但是,如果相反的情况属实(即TempInvoice派生自Invoice),则可以进行显式转换,但前提是getInvoice方法正在创建TempInvoice对象或从TempInvoice派生的对象。否则,当您尝试进行显式转换时,您将获得InvalidCastException。请记住,只有像Java或Microsoft.NET这样的平台才能为您捕获一个漂亮,干净的异常。从C或C ++这样的语言来看,事情会变得更加糟糕,因为它们会让你做一些盲目的事情而不需要警告(static_cast和dynamic_cast将无法编译),这通常会导致垃圾数据(最好的情况) ,或者代码中更远的随机点的访问冲突(最坏情况)。

如果你绝对需要有两个对象,那么最好的办法就是从另一个中派生出一个,或者将常用方法分解为一个可以继承的单独基类。但是,您不应该盲目地从函数调用中转发返回值。如果你知道某个函数总是返回相同的类型,你应该直接使用该类型,并且无论如何都要避免向下转换。它对生成的代码更安全,更高效。如果您正在使用工厂模式,则可以在基础接口中构建某种形式的RTTI,这样您就不会进行(大多数)盲目转换。一个很好的例子(albiet有点复杂)是COM对象的QueryInterface方法,但你可以做一些像添加Invoice.Type属性一样简单的事情。