나는 사건이 일어나는 곳인 Venue
이라는 개념을 가진 응용 프로그램을 가지고 있습니다. Venue
에는 VenuePart
이 많이 있습니다. 그래서, 그것은 다음과 같습니다서로 상속하지만 서로 상속하는 속성을 가진 C# 클래스는 어떻게 구성합니까?
public abstract class Venue
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<VenuePart> VenueParts { get; set; }
}
Venue
는 기울기를 가지고 VenuePart
의 특정 종류가 HoleVenuePart
라는 Venue
인 GolfCourseVenue
될 수 있습니다 앞으로
public class GolfCourseVenue : Venue
{
public string Slope { get; set; }
public virtual ICollection<HoleVenuePart> Holes { get; set; }
}
, Venue
에서 상속받은 다른 종류의 Venue
도있을 수 있습니다. 그들은 자신의 필드를 추가 할 수 있으며 항상 자신의 특정 유형의 VenuePart
을 갖습니다. 여기
VenuePart
클래스입니다 : 정말이 일을 단지를해야 할 때 지금은
GolfCourseVenue
이와 컬렉션을 가지고 있기 때문에
public abstract class VenuePart
{
public int Id { get; set; }
public string Name { get; set; }
public abstract string NameDescriptor { get; }
}
public class HoleVenuePart : VenuePart
{
public override string NameDescriptor { get { return "Hole"; } }
public int Yardage { get; set; }
}
내 선언은 위, 잘못된 것 같다. 유형이 다르니까 무시할 수는 없습니다. 맞습니까? 보고서를 실행할 때 클래스를 일반적으로 참조하기를 원합니다. 여기서는 Venue
및 VenuePart
을 방금 뱉습니다. 그러나 양식 등을 렌더링 할 때 구체적으로 말씀 드리고자합니다.
나는 이와 같은 관계가 많고 내가 뭘 잘못하고 있는지 궁금해하고 있습니다. 예를 들어, OrderItem
을 갖는 Order
을 가지지 만 특정 종류의 OrderItem
을 갖는 특정 종류의 Order
도 있습니다.
업데이트 :이 클래스는 Entity Framework Code-First 엔터티입니다. 나는 이것이 중요하지 않길 기대했지만, 아마도 그렇게되었을 것이라고 생각한다. Code-First가 테이블을 제대로 만들 수있는 방법으로 클래스를 구조화해야합니다. Code-First는 제네릭을 처리 할 수있는 것처럼 보이지 않습니다. 죄송이 구현 세부 사항 우아한 솔루션의 방법으로 점점 :/
업데이트 2 : 특정의 수 아형 내에서 목록을 제한 할 수있는 방법이 될 듯 Covariance and Contravariance에서 지적 검색, 연결 사람 하위 유형 자체. 그것은 정말로 유망한 것처럼 보이지만 그 사람은 대답을 삭제했습니다! 누구든지 이러한 개념을 어떻게 활용할 수 있는지에 대한 정보가 있습니까?
업데이트 3 : 사람들을 혼동시키고 문제를 설명하는 데 도움이되지 않았기 때문에 하위 개체에 있던 탐색 속성을 제거했습니다.
다음public abstract class VenuePart
{
public abstract string NameDescriptor { get; }
}
public class HoleVenuePart : VenuePart
{
public string NameDescriptor { get{return "I'm a hole venue"; } }
}
public class Venue<T> where T : VenuePart
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Company Company { get; set; }
public virtual ICollection<T> VenueParts { get; set; }
}
public class GolfCourseVenue : Venue<HoleVenuePart>
{
}
GolfCourseVenue이 HoleVenueParts 또는 슈퍼 클래스 HoleVenueParts를 포함 할 수 있습니다 수집 VenueParts을 가지고 :
Part 클래스를 추가 했으므로 왜 추상화가 필요한지 알 수있었습니다. 하지만, 당신은 Venue에 대해 옳습니다. 그것은 추상적 일 필요는 없습니다. – Chris
GolfCourseVenue의 생성자에서 [공분산] (http://msdn.microsoft.com/en-us/library/dd799517.aspx)을 사용하여 VenuePart 컬렉션을 HoleVenueParts로 제한 할 수 있습니까? 이 일의 기복에 대해 잘 알고 있습니까? EF가 이것을 처리하지 못하기 때문에 제네릭 솔루션을 사용할 수 없을 것이라고 생각합니다. – Chris