如何使用OOP进行设计

mrb*_*lah 3 c# oop

我有一个名为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)

可以这样做吗?

BFr*_*ree 5

将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)