Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为只读视图设计对象_C#_Oop - Fatal编程技术网

C# 为只读视图设计对象

C# 为只读视图设计对象,c#,oop,C#,Oop,在我当前的项目中,我有一个由其他自定义对象组成的类公司 class Company { Address mailingAddress; Address physicalAddress; MailingTypes mailinTypes; ... } 当用户搜索公司时,用户界面必须显示公司名称、地址和邮件类型。我可以在数据集或数据读取器中获取数据。我的问题是,我是否必须在迭代结果时创建Company和child对象,还是应该创建一个新的Company

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

 class Company {
     Address mailingAddress;
     Address physicalAddress;
     MailingTypes mailinTypes; 
     ...
 }
当用户搜索公司时,用户界面必须显示公司名称、地址和邮件类型。我可以在数据集或数据读取器中获取数据。我的问题是,我是否必须在迭代结果时创建Company和child对象,还是应该创建一个新的CompanyView结构,该结构只包含用于显示的字符串,如下所示?这是一个更好的方法

  class CompanyView {
      string MailingAddress;  
      string physicalAddress;
      ....
  }
谢谢,
全金属

这实际上取决于结果的下游用途。在某些情况下,创建一个仅用于显示的字符串的新对象可能会有所帮助,尤其是在需要显示大量字符串的情况下


但同时,另一种方法也会起作用。

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

我正在处理一个具有类似功能的项目。我使用的是类似于:

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

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

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

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);} }

}
我的后端代码如下:

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);} }

}

这就是我最初的想法。但要填充company对象,我必须创建不必要的Address对象。这是最好的做法。我们分页,最大页面大小是50。这么多东西。因此,我将继续使用当前的公司对象。谢谢你的意见。谢谢你的回答。Address类有一个类似于GetAddressString()的方法,我将使用它。Np,我使用这样的方法,并将List(我是您的案例)直接绑定到datagrid。