2014-02-18 56 views
0

我能StudentRegistered类的属性StudentId是同一类型为Student.Id(即byte),而不在StudentRegistered声明提byte有属性是同一类型的另一个类的属性

我想在我的应用程序中为每个派生类Person定义Id类型。我错过了什么?

public class Person<T> 
{ 
    public T Id { get; set; } 
    public string Name { get; set; } 
} 

public class Student : Person<byte> { } 
public class Adult : Person<short> { } 

public class StudentRegistered 
{ 
    public /* type */ StudentId { get; set; } 
    public int EventId { get; set; } 
} 

编辑,澄清:

  • 我希望避免具有提Student.Id的类型(即,byte)外Student声明的任何地方。
  • 我不需要string Name作为StudentRegistered的财产。
  • StudentRegistered将不会有Adult s。 A byte类型为StudentRegistered.StudentId就足够了。
+1

在你的例子中'StudentRegistered'不是从'Person'派生的。 – BatteryBackupUnit

+0

这是一个坏主意。你想用“ID”的不同类型来达到什么目的? – ja72

回答

1

没有就没有办法做你在问什么,因为StudentRegistered将是两种不同类型,byteStudentIdshort之一。

这里有一些严重的设计问题,需要不同类型的公共ID。您最好选择与InnerID方法具有共同的基础接口,然后将该interfface与注册链接起来。

public interface IPerson 
{ 
    ValueType InnerID { get; } 
} 

public abstract class Person<T> : IPerson 
    where T : struct 
{ 
    public T ID { get; set; } 
    protected abstract ValueType InnerID { get; } 
    ValueType IPerson.InnerID { get { return InnerID; } } 
} 
public class Student : Person<byte> 
{ 
    protected override ValueType InnerID 
    { 
     get { return ID; } 
    } 
} 
public class Adult : Person<short> 
{ 
    protected override ValueType InnerID 
    { 
     get { return ID; } 
    } 
} 

public class StudentRegistered 
{ 
    public ValueType StudentID { get { return Person.InnerID; } } 
    public IPerson Person { get; set; } 
    public int EventId { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var A=new Student() { ID=100 }; // byte 
     var B=new Adult() { ID=1000 }; // short 

     var regA=new StudentRegistered() { Person=A }; 
     Console.WriteLine("Type: {0} Value: {1}", regA.StudentID.GetType().Name, regA.StudentID); 
     // Type: Byte Value: 100 
     var regB=new StudentRegistered() { Person=B }; 
     Console.WriteLine("Type: {0} Value: {1}", regB.StudentID.GetType().Name, regB.StudentID); 
     // Type: Int16 Value: 1000 
    } 
} 
1

是的,你可以把它通用和继承Person<T>

public class StudentRegistered<T> : Person<T> 
{ 
    public T StudentId {get; set;}; 
    public int EventId {get; set;}; 
} 
0

你必须从某个地方使用泛型,你可以这样做:

public class StudentRegistered<TS, TId> where TS : Person<TId> 
{ 
    public TId StudentId {get; set;} 
    public int EventId {get; set;} 
}