【发布时间】:2014-12-15 15:50:56
【问题描述】:
所以我想成为一个好朋友,帮助我认识的人学习他们的 Java 类,因为我有编写一些网络应用程序的经验。 (Java 不是我的第一语言)所以他给了我一个他想要帮助的奖金作业。我们似乎确定的其他一切都很好,但是交给我朋友的奖金任务几乎与我对任何编程语言的想法背道而驰。显然,如果你用任何编程语言扩展一个类。 C++、Java、PHP,您只能访问受保护或公开的子类变量。显然,如果您试图访问任何私人的东西或试图打破规则,您需要退后一步。 ...对吗?
显然任务是这样的:您需要修改这个名为“InvoicePrinter”的程序,以便您可以在 HTML 中打印发票,并且您不能修改任何用于 InvoiceFormatter 的 ECXEPT 类
这是程序的总结。
//Address.java
class Address
{
private String m_name;
private String m_street;
Address(String name, String street)
{
m_name = name;
m_street = street;
}
}
//Invoice.java
class Invoice
{
private Address m_location;
private Products m_products;
Invoice(Address addr)
{
m_location = addr;
}
public void format()
{
//Print data here...
}
}
//InvoicePrinter
class InvoicePrinter
{
int main(//...)
{
Invoice myInvoice = new Invoice(new Address("My company", "12345 n Street Way"));
myInvoice.addProduct(new Product("box", 1.20));
myInvoice.addProduct(new Product("glasses", 5.00));
//Print Invoice on screen...
myInvoice.format();
//Add your invoice printer here here...
}
}
//InvoiceFormater.java
class InvoiceFormater
{
private Invoice myInv;
InvoiceFormater(Invoice invoice)
{
myInv = invoice;
}
public static void format()
{
//Print your HTML formatter here.
}
}
因此,除非我正在慢慢变成 Java 初学者或其他人,但我看到如何能够从 Invoice 中提取数据的唯一方法是扩展“InvoiceFormatter”并使用 Super,但您仍然需要访问“Invoice” " 数据,例如地址等...那么如何在不更改除 int main 或 InvoiceFormatter 之外的任何代码的情况下执行此操作?
...我承认,这让我有点发疯,只是想它会如何工作,因为这听起来像是《盗梦空间》中的东西或悖论...哈哈
【问题讨论】:
-
作业似乎自相矛盾;你说
InvoicePrinter是唯一可以修改的类,但是Invoice.format和InvoiceFormatter.format方法要求你实现它们。 -
谷歌 java 反射。
-
你的直觉是正确的,这个任务看起来很荒谬。例如,
Address类在编写时完全没用。唯一明智的方法是修改现有的类。这段代码中还有很多废话,比如int main不是 Java,(//...)不是正确的 Java(或 C 或 C++)注释。