哪种方法更好
public class Account
{
public UserAccount GetUserDetails(string acctId)
{
return new UserAccount().GetDetails(); //call method from class UserAccount
}
public UserAccount GetUserDetails(string acctId)
{
return new UserOtherDetails().GetDetails(); //call method from another class
}
}
或包含类似这样的类
public class Account
{
private UserAccount userAccount; //contain UserAccount class
private UserOtherDetails userOtherDetails;
public UserAccount GetUserDetails(string acctId)
{
return userAccount.GetDetails(); //invoke the method from UserAccount class
}
public UserOtherDetails GetOtherDetails(string acctId)
{
return new userOtherDetails().GetDetails(); //call method from another class
}
}
或任何其他方法的人?
编辑:如果我在方法上添加参数怎么办?
补充:我的观点是当我调用GetUserDetails方法时,我不想实例化UserOtherDetails类
答案 0 :(得分:4)
由于userAccount
必须以某种方式初始化[至少通过帐号],我宁愿使用第二个。
答案 1 :(得分:2)
你的第二种方法更好。第一种方法是讨厌的,因为每次调用GetUserDetails时都会创建一个UserAccount类的新实例。
您也可以将其公开为属性
public class Account
{
public UserAccount Details {get; private set;}
}
这是一个例子
public class Account
{
public UserAccount UserDetails {get; private set;}
public UserOtherDetails OtherDetails {get; private set;}
public Account (UserAccount userDetails, UserOtherDetails otherDetails)
{
this.UserDetails = userDetails;
this.OtherDetails = otherDetails;
}
}
以上假设您已经加载了UserDetails和UserOtherDetails。如果您想按需加载详细信息,那么您可能会这样做。
public class Account
{
private UserAccount _userDetails;
private UserOtherDetails _otherDetails;
public GetUserAccountDetails(string accountId)
{
if (_userDetails == null)
{
// This could be a nice place to look at various factory patterns.
_userDetails = new UserAccount();
_userDetails.Load(accountId);
}
return _userDetails;
}
...
}
答案 2 :(得分:1)
我不使用C#,但我个人并不完全支持这种聚合。当您需要除UserAccount :: GetDetails()之外的其他实现或者您希望Account为不同类型的更具体帐户的工厂时,您会使用类似的东西。
回到这个问题,如果能以某种方式帮助你,我更喜欢第二种方法。
答案 3 :(得分:1)
Getters和setter将是最简单的方法:
public class User
{
public string Name { get; set; }
public string TagLine { get; set; }
}
public class Account
{
public User Owner { get; set; }
}
// then...
Console.WriteLine(account.Owner.Name);
Console.WriteLine(account.Owner.TagLine);
答案 4 :(得分:1)
一如既往:取决于。
第一个示例为每个调用创建一个新UserAccount
实例,而第二个示例重用先前创建的实例。如果不知道UserAccount
表示什么以及它的构造函数是什么,就不可能回答哪个选项更好。
您是否正在考虑选项1,因为如果从未调用该方法,您希望避免创建UserAccount对象?在这种情况下,延迟加载可能是你想要的:
private UserAccount userAccount;
public Details GetUserDetails()
{
if (userAccount == null)
userAccount = new UserAccount();
return userAccount.GetDetails();
}