为只读视图设计对象

时间:2010-11-19 18:12:14

标签: c# oop

在我目前的项目中,我有一个由其他自定义对象组成的类公司。

 class Company {
     Address mailingAddress;
     Address physicalAddress;
     MailingTypes mailinTypes; 
     ...
 }

当用户搜索公司时,UI必须显示,名称,地址和邮件类型。我可以在DataSet或datareader中获取数据。我的问题是,我是否必须在迭代结果时创建公司和子对象,还是应该创建一个新的CompanyView Struct,它只包含用于显示的字符串,如下所示?哪种方法更好。

  class CompanyView {
      string MailingAddress;  
      string physicalAddress;
      ....
  }

谢谢, 全金属

4 个答案:

答案 0 :(得分:1)

这实际上取决于结果的下游用法。在某些情况下,创建一个仅用于显示的字符串的新对象会很有帮助,特别是如果要显示大量的对象。

但同时另一种方法也可以。

答案 1 :(得分:0)

覆盖Address类的ToString方法,您不需要创建新的CompanyView。

答案 2 :(得分:0)

我正在研究一个具有类似功能的项目。我使用的是:

class Company {
    Address _mailingAddress;
    [DisplayName("Mailing Address")]
    public string MailingAddress {
        get {
            if (_mailingAddress==null) {
                 return null;
            }
            return _mailingAddress.GetAdressString();
        }
    }
}

Address应该有GetAdressString()方法,该方法应该以适当的形式为您提取地址数据。

答案 3 :(得分:0)

我希望我的客户端代码如下所示:

IAddress address = AddressFactory.MakeAddress("76 Main St", "3333", "CloseToNowhere");
Company c = Company.Make(address);
Console.WriteLine(c.MailingAddress.FullAddress);

我的后端代码如下:

public interface IAddress
{
    string Steet { get; }
    string ZipCode { get; }
    string City { get; }
}

public interface IMailingAddress : IAddress
{
    string FullAddress { get; }
}

public static class AddressFactory
{
    private class Address : IAddress
    {
        public string Steet { get; set; }
        public string ZipCode { get; set; }
        public string City { get; set; }
    }

    private class MailingAddress : Address, IMailingAddress
    {
        public string FullAddress
            { get { return string.Format("{0} {1} {2}", Steet, ZipCode, City); } }
    }

    static public IAddress MakeAddress(string street, string zip, string city)
        { return new Address() { Steet = street, ZipCode = zip, City = city }; }

    static public IMailingAddress MakeMailingAddress(IAddress address)
        { return new MailingAddress() { Steet = address.Steet, ZipCode = address.ZipCode, City = address.City }; }
}


public class Company
{
    private IAddress _address;

    private Company(IAddress address) { _address = address; }

    static public Company Make(IAddress address)
        { return new Company(address); }

    public IAddress Address
        { get { return _address; } }

    public IMailingAddress MailingAddress
        { get{return AddressFactory.MakeMailingAddress(_address);} }

}