我有一个名为User的对象,其中包含Username,Age,Password email等属性.
我在ado.net代码中初始化此对象,如:
private User LoadUser(SqlDataReader reader)
{
User user = new User();
user.ID = (int)reader["userID"];
// etc
}
Run Code Online (Sandbox Code Playgroud)
现在说我创建一个继承自User的新对象,如:
public class UserProfile : User
{
public string Url {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
现在我需要创建一个加载userprofile的方法,所以目前我在做:
public UserProfile LoadUserProfile(SqlDataReader reader)
{
UserProfile profile = new UserProfile();
profile.ID = (int)reader["userID"];
// etc. copying the same code from LoadUser(..)
profile.Url = (string) reader["url"];
}
Run Code Online (Sandbox Code Playgroud)
是否有更多的OOP方法,所以我不必从LoadUser()在LoadUserProfile()镜像我的代码?
我希望我能做到这一点:
UserProfile profile = new UserProfile();
profile = LoadUser(reader);
// and then init my profile related properties
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
将LodUser方法移动到User Base类并使其成为虚拟.然后,在UserProfile方法中,您重写此方法.
public class User
{
public virtual void Load(SqlDataReader reader)
{
this.Id = reader["Id"];
//.. whatever else
}
}
public class UserProfile : User
{
public string ExtraProp {get;set;}
public override void Load(SqlDataReader reader)
{
base.Load(reader);
this.ExtraProp = reader["ExtraProp"];
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以做一些像:
UserProfile up = new UserProfile();
up.Load(myReader);
Run Code Online (Sandbox Code Playgroud)