我必须上课。让我们说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.)
答案 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
,并声明其中Invoice
和TempInvoice
的所有常用属性和方法。
让Invoice
和TempInvoice
都实现此界面。
完成此操作后,您仍无法将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属性一样简单的事情。