C#Classes to List => Loop =>打印

时间:2017-06-07 12:10:36

标签: c# list collections

嘿伙计们我最近开始使用microsoft .Net Tutorials学习C#。

我坚持“课堂和对象”课程。 在每节课结束时,我们会做一些“功课”。 我需要编写一个程序,为使用三个不同类(Person,Copmany,Address)的人和公司打印出地址。我需要将它们添加到集合中并循环遍历,打印出每个公司或个人的地址。

这是LINK(在页面的末尾有一个示例程序的样子。

我不确定我怎么想实现这个目标。有人可以帮我理解。这就是我到目前为止所做的:

public class Address
{
public string StreetAddress { get; set; }
public string City { get; set; }
public string State { get; set; }
public string PostalCode { get; set; }
public string Country { get; set; }

public override string ToString()
{
    return $"{StreetAddress}, {City}, {PostalCode}, {Country}";
}
public Address()
{
    StreetAddress = "Main123";
    City = "SomeTown";
    State = "OH";
    PostalCode = "12345";
    Country = "United States";
}
}

public class Person : Master
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Address ShippingAddress { get; set; }

public Person(string firstName, string lastName)
{
    FirstName = firstName;
    LastName = lastName;
    ShippingAddress = new Address();
}
public override string ToString()
{
    return $"{FirstName} {LastName} {ShippingAddress}\n";
}
}

public class Company : Master
{
public string Name { get; set; }
public Address ShippingAddress { get; set; }

public Company(string name)
{
    Name = name;
    ShippingAddress = new Address();
}
public override string ToString()
{
    return $"{Name} {ShippingAddress}\n";
}
}


public class Master
{
public static List<Master> data = new List<Master>();
public static void Coll(Master master)
{
    data.Add(master);
    data.ForEach(Console.WriteLine);
}
}

class MainClass
{
public static void Main(string[] args)
{
    Person John = new Person("John", "Smith");
    Master.Coll(John);
}
}

2 个答案:

答案 0 :(得分:0)

如果您已经到达教程的末尾,那么这意味着您已经阅读了有关继承和多态的部分。 请仔细阅读本节。

如果您的任务是:打印出每个公司或个人的地址

查看教程中有关ToString方法的内容:

  

请注意,您可以在任何类上覆盖ToString方法,以显示与该类实例相关的字符串数据。

因此,您首先要通过覆盖Address方法让课程ToString能够显示其内容。

您的第二步是使用继承并创建一个超类,可以由您的2个类PersonCompany继承。正如教程中使用类Shape完成的那样。

这样您就可以将它们添加到[单个]集合(正如您在请求中所写的那样)。

尝试结合这些步骤,如果您仍有疑问,请发表评论。 (请继续重读教程,所有必要的信息都在那里,你只需要结合不同的部分)。祝你好运!

编辑:

编辑完代码后,接下来的步骤就是让您的课程PersonCompany能够显示有关自己的信息。这意味着你应该覆盖ToString方法。

一个提示:您可以使用班级ToString的{​​{1}}方法来显示Address的详细信息。无需再次编写详细信息;)如果将变量包含在外推字符串ShippingAddress中,则会隐式调用$"...方法并显示所有详细信息:

ToString

$"{ShippingAddress}" 方法的一个问题是它使用本地变量Coll作为存储。当编译器从方法返回时,此变量将不再存在。另一个问题是,在每次调用中,您都会创建一个新的List<Master> data,因此无法存储超过1个元素。你可以做的是在List类中使它成为static变量。因此,每次添加项目时,它都将保留在内存中,以后可以访问。 您也可以创建方法Master,因为它实际上不需要调用static类型的对象(它不访问任何类属性)

Master

你可以这样称呼它:

public class Master
{
    public static List<Master> data = new List<Master>();

    public static void Coll(Master master)
    {        
        data.Add(master);
        data.ForEach(Console.WriteLine);
    }
}

答案 1 :(得分:0)

这是相当直接的。你可以使用接口或多态来做到这一点。

您需要将对象放入集合中,并遍历所有对象。

entityList = new List<IPrintable>();
foreach(var entity in entityList)
{
    entity.PrintAddress();
}

要实现这一点,您需要为这两个类使用通用接口;

internal interface IPrintable
{
    void PrintAddress();
}

您需要在两个类中实现此接口。

public class Person : IPrintable
{
    public void Print()
    {
        Console.WriteLine("Person's address is {0}", ShippingAddress.ToString());
    }
}

public class Company : IPrintable
{
    public void Print()
    {
        Console.WriteLine("Company's is {0}", ShippingAddress.ToString());
    }
}

public class Address
{
    public string ToString()
    {
        return string.Format(" Street: {0}, {1}, {2}, {3}, post code{4}, {5}", StreetAddress, City, State, PostalCode, Country);           
    }
}

不是使用通用接口,而是可以创建抽象基类,它将保存ShippingAddress字段并具有虚拟方法Print()而无需实现。然后,此基类将是您在List类中使用的类型    var entitylist = newList();

public abstract class ShippableEntity
{
    private Address _Address;

    private ShippableEntity(Address address)
    {
        _Address = address;
    }

    public abstract void Print();

    public Address ShippingAddress { get { return _Address; } }
}

然后在Person和Company中继承此类,并在具体类中实现Print方法。 然后你可以这样做:     entitylist.Add(new Person(....));     entitylist.Add(new Company(....));

并使用foreach和接口做同样的事情。

您需要调用基类构造函数!

public class Person : ShippableEntity
{
     public Person(Address address)
             : base(adress)
     {
     }
}

我希望这会有所帮助。