我可以将StudentId
类StudentRegistered
的属性与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}}类型就足够了。答案 0 :(得分:1)
是的,您可以将其设为通用并从Person<T>
public class StudentRegistered<T> : Person<T>
{
public T StudentId {get; set;};
public int EventId {get; set;};
}
答案 1 :(得分:1)
没有办法做你要求的事,因为StudentRegistered
将是两种不同的类型,一种byte
StudentId
和short
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;}
}