繁体   English   中英

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

[英]Have property be the same type as property of another class

我可以拥有财产StudentId类的StudentRegistered是同一类型的Student.Id (即byte ),就不能不提byteStudentRegistered声明?

我想在我的应用程序中为每个派生类的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声明之外的任何地方提及Student.Id的类型(即byte )。
  • 我不需要string Name作为StudentRegistered的属性。
  • StudentRegistered没有Adult StudentRegistered.StudentIdbyte类型就足够了。

是的,你可以使它成为通用的并继承自Person<T>

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

没有就没有办法做你所要求的,因为StudentRegistered将是两种不同的类型,一种以byteStudentId和一个带有shortStudentId

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

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
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM