嘿伙计们我最近开始使用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);
}
}
答案 0 :(得分:0)
如果您已经到达教程的末尾,那么这意味着您已经阅读了有关继承和多态的部分。 请仔细阅读本节。
如果您的任务是:打印出每个公司或个人的地址
查看教程中有关ToString
方法的内容:
请注意,您可以在任何类上覆盖ToString方法,以显示与该类实例相关的字符串数据。
因此,您首先要通过覆盖Address
方法让课程ToString
能够显示其内容。
您的第二步是使用继承并创建一个超类,可以由您的2个类Person
和Company
继承。正如教程中使用类Shape
完成的那样。
这样您就可以将它们添加到[单个]集合(正如您在请求中所写的那样)。
尝试结合这些步骤,如果您仍有疑问,请发表评论。 (请继续重读教程,所有必要的信息都在那里,你只需要结合不同的部分)。祝你好运!
编辑:
编辑完代码后,接下来的步骤就是让您的课程Person
和Company
能够显示有关自己的信息。这意味着你应该覆盖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)
{
}
}
我希望这会有所帮助。