在我的MVC应用程序中,几个视图模型几乎完全相同。我不是每次都复制模型,而是想我可以创建一个类。我当时不确定的是如何在每个模型中包含该类。
例如,让我们说我的模型看起来像这样:
public class AccountProfileViewModel
{
public string FirstName { get; set; }
public string Lastname { get; set; }
public AccountProfileViewModel() { }
}
但我知道FirstName和LastName将在许多模型中广泛使用。因此,我在其中创建了一个包含AccountProfile的类库:
namespace foobar.classes
{
public class AccountProfile
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
}
回到模型中,我将如何包含该类,以便FirstName和LastName在模型中,但不是专门创建的?
答案 0 :(得分:6)
创建一个Base类,然后使用继承,您可以访问这些公共属性。
public class AccountProfile
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
public class OtherClass : AccountProfile
{
//here you have access to FirstName and Lastname by inheritance
public string Property1 { get; set; }
public string Property2 { get; set; }
}
答案 1 :(得分:3)
除了使用继承之外,您还可以使用合成来实现相同的目标。
请参阅Prefer composition over inheritance
这将是:
public class AccountProfile
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
public class AccountProfileViewModel
{
// Creates a new instance for convenience
public AnotherViewModel() { Profile = new AccountProfile(); }
public AccountProfile Profile { get; set; }
}
public class AnotherViewModel
{
public AccountProfile Profile { get; set; }
public string Property1 { get; set; }
public string Property2 { get; set; }
}
答案 2 :(得分:2)
你也可以实现像IProfileInfo
这样的接口,这可能更好,因为类可以实现多个接口,但只能从一个类继承。在将来,您可能希望在需要继承它的代码中添加一些其他统一的方面,但您可能不一定需要从具有Firstname和Lastname属性的基类继承的某些类。如果您正在使用visual studio,它将自动为您实现接口,因此无需额外的工作。
public class AccountProfile : IProfileInfo
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
public interface IProfileInfo
{
string Firstname {get;set;}
string Lastname {get;set;}
}
答案 3 :(得分:1)
这太长了,不能留在评论中,所以这只是基于你已经收到的答案的评论。
如果您创建的新类基本上只是略有不同的对象类型,则应该只使用继承。如果您尝试将2个单独的类关联在一起,则应使用属性方法。继承类似于
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DOB { get; set; }
}
public class Teacher : Person
{
public string RoomNumber { get; set; }
public DateTime HireDate { get; set; }
}
public class Student : Person
{
public string HomeRoomNumber { get; set; }
public string LockerNumber { get; set; }
}
组合应该像这样使用。
public class Address
{
public string Address1 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
public class StudentViewModel
{
public StudentViewModel ()
{
Student = new Student();
Address = new Address();
}
public Student Student { get; set; }
public Address Address { get; set; }
}