属性与另一个类的属性相同

时间:2014-02-18 16:19:43

标签: c# class generics properties

我可以将StudentIdStudentRegistered的属性与Student.Id的类型相同(即byte),而不在{{1}中提及byte声明?

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

Person

编辑,澄清:

  • 我希望避免在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中没有Adult个。 StudentRegistered的{​​{1}}类型就足够了。

3 个答案:

答案 0 :(得分:1)

是的,您可以将其设为通用并从Person<T>

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

答案 1 :(得分:1)

没有办法做你要求的事,因为StudentRegistered将是两种不同的类型,一种byte StudentIdshort StudentId InnerID 1}}。

这里存在严重的设计问题,要求使用不同类型的公共ID。您最好选择使用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}}

答案 2 :(得分:0)

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

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