所以我想成为一个好朋友并用他们的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"并使用超级,但你仍然需要访问"发票"数据,例如Address等等......那么如果不改变除int main或InvoiceFormatter之外的任何代码,怎么会这样做呢?
......我承认,这让我有点疯狂,只是想想它是如何起作用的,因为它听起来像起源或悖论...... LOL
答案 0 :(得分:0)
根据定义,您不能访问另一个类的私有字段(内部或封闭类除外,但这不是这种情况)。
让我详细说明:Invoice
类中的字段m_location
和m_products
似乎没有访问者,因此您有三个选项:
format()
的输出中解析这些字段(这就像作弊)Invoice
类答案 1 :(得分:0)
您可以使用' Reflection'获取私人课程信息。 Reflection允许您获取有关类的信息,例如可用的方法和字段。但它也允许您获取字段的值,或者在您发现它们存在后调用该方法。
有关反射的更多信息以及一些教程,您可以访问Oracle的Reflection tutorials。
这样,以下问题和接受的答案可能会帮助您解决问题的具体示例:How do I read a private field in Java?
What is reflection and why is it useful?
的接受者也提供了有关反思的更多信息请注意,我怀疑这是您老师的预期解决方案......从教学的角度来看,似乎更有意义的是您也可以修改Invoice
,因为使用反射这些简单的任务(添加setter ad getters)是一个巨大的过度杀伤!