在对象中创建对象类

本文关键字:创建对象 对象 | 更新日期: 2023-09-27 18:34:31

我有一个看似简单的问题,但由于某种原因,我在理解一个包含多个对象的对象的概念时遇到了问题。例如,假设我们有一个带有页眉和页脚的对象,中间有多个对象。

与报表一样,标头将具有名称和地址。页脚将包含购买的项目的总数。介于两者之间的是带有部件号、描述和价格的行项目。

我想我可以有一个带有页眉、页脚和行项目对象数组的对象,所有这些都有自己的属性。我以报告为例,因为这是我能想到的唯一接近解释我的问题的概念。

有人可以给我发送一个链接或解释如何创建这种类型的对象吗?

我正在使用VS 2010和 VB.net,我可以从C#转换为VB。

    Report Object
       Header Object
         Property Name
         Property Date
       End
       LineItem() Array Object
         Property Part Number
         Property Part Description
         Property Number of Items
         Property Per Item Price
         Property Total price
       End 
       Footer Object
         Property Total Items count
         Property Total Price
       End
     End

在对象中创建对象类

Jeff,在C#中,最基本的:

public class Report
{
    // typical simple property in report
    public string ReportUid { get; set; }
    // object properties
    public Header Header { get; set; }
    public Body Body { get; set; }
    public Footer Footer { get; set; }
    public Report()
    {
        Header = new Header();
        Body = new Body();
        Footer = new Footer();
    }
    internal void CalculateFooterTotals()
    {
        // summerize the lineitems values in the footer
        Footer.TotalItems = Body.LineItems
            .Sum(x => x.Quantity);
        Footer.TotalPrice = Body.LineItems
            .Sum(x => x.Total);
    }
}
public class Header
{
    public string Name { get; set; }
    public DateTime Date { get; set; }
}
public class Body
{
    public IList<LineItem> LineItems { get; set; }
    public Body()
    {
        LineItems = new List<LineItem>();
    }
}
public class LineItem
{
    public string PartNumber { get; set; }
    public string PartDescription { get; set; }
    public int Quantity { get; set; }
    public float ItemPrice { get; set; }
    // computed 
    public float Total
    {
        get { return Quantity * ItemPrice; }
    }
}
public class Footer
{
    // populated via report.CalculateFooterTotals()
    public int TotalItems { get; internal set; }
    public float TotalPrice { get; internal set; }
}

当然,有些属性是计算的,而不是get/set。

[编辑] - 认为添加一些用法是一个很好的做法,因为我看到你问道格拉斯这个问题(很可能来自数据库或其他来源(:

// usage - set up report
var report = new Report {
    ReportUid = Guid.NewGuid().ToString(),
    Header =
    {
        Name = "My new report", 
        Date = DateTime.UtcNow
    }};
// add lineitems to body (in real case, probably a loop)
report.Body.LineItems.Add(new LineItem()
    {
        Quantity = 1,
        ItemPrice = 12.30f,
        PartDescription = "New shoes", 
        PartNumber = "SHOE123"
    });
report.Body.LineItems.Add(new LineItem()
    {
        Quantity = 3, 
        ItemPrice = 2.00f, 
        PartDescription = "Old shoes", 
        PartNumber = "SHOE999"
    });
report.Body.LineItems.Add(new LineItem()
    {
        Quantity = 7, 
        ItemPrice = 0.25f, 
        PartDescription = "Classic Sox", 
        PartNumber = "SOX567"
    });
// summerize the lineitems values in the footer
report.CalculateFooterTotals();

现在将报表应用于画布图面(HTML 等(。

private static void DispalyData(Report report)
{
    // set out the basics
    Console.WriteLine("Header");
    Console.WriteLine(report.ReportUid);
    Console.WriteLine(report.Header.Date);
    Console.WriteLine(report.Header.Name);
    // now loop round the body items
    Console.WriteLine("Items");
    foreach (var lineItem in report.Body.LineItems)
    {
        Console.WriteLine("New Item---");
        Console.WriteLine(lineItem.PartDescription);
        Console.WriteLine(lineItem.Quantity);
        Console.WriteLine(lineItem.ItemPrice);
        Console.WriteLine(lineItem.PartNumber);
        Console.WriteLine(lineItem.Total);
        Console.WriteLine("End Item---");
    }
    // display footer items
    Console.WriteLine("Footer");
    Console.WriteLine(report.Footer.TotalItems);
    Console.WriteLine(report.Footer.TotalPrice);
}
// called in code as:
DispalyData(report);

希望这扫描正常...将其推送到社区维基(通过编辑(,因为它是一个普遍追捧的话题。

[顺便说一句] - 虽然你会知道 C# 来 vb.net 转换器,但我尝试过这个,它看起来很有希望:http://www.developerfusion.com/tools/convert/csharp-to-vb

您需要为每种类型的对象创建一个类。 最好给他们每个人自己的文件。

Public Class Report
  Public Property Header As Header
  Public Property LineItems As IEnumerable(Of LineItem)
  Public Property Footer As Footer
End Class

Public Class Header
  Public Property Name As String
  ' This probably isn't the best word choice because it is a type alias in VB
  Public Property [Date] As Date
End Class

Public Class LineItem
  Public Property PartNumber As Integer
  Public Property PartDescription As String
  Public Property NumberOfItems As Integer
  Public Property PerItemPrice As Decimal
  Public Property TotalPrice As Decimal
End Class

Public Class Footer
  Public Property TotalItemsCount As Integer
  Public Property TotalPrice As Decimal
End Class

像这样使用它:

Dim myReport As New Report()
Dim myHeader As New Header()
Dim lineItem1 As New LineItem()
Dim lineItem2 As New LineItem()
Dim myFooter As New Footer()
With myReport
    .Header = myHeader
    .Footer = myFooter
    .LineItems = {lineItem1, lineItem2}   
End With