目标是在基类中定义一个静态成员,对于从基类继承的每个子类,静态成员将具有不同的值(在这种情况下,是可枚举属性的列表)。我知道静态成员是静态的,因此它们“只存在一次”,因此在基类中不能有不同的值。
但是我确实提出了一种让看起来的方法,就好像它有不同的值。
鉴于此代码:
public class Parent<TSelfReferenceType>
{
public static readonly List<PropertyInfo> enumerableProperties
= GetEnumerableProperties();
public static Type GetTheType()
{
return typeof(TSelfReferenceType);
}
public static List<PropertyInfo> GetEnumerableProperties()
{
return GetTheType().GetProperties()
.Where(property => property.PropertyType.IsEnum)
.ToList();
}
}
public class ChildA : Parent<ChildA>
{
public EnumTypeOne ActivityType { get; set; }
public EnumTypeTwo LogLevel { get; set; }
}
public class ChildB : Parent<ChildB>
{
public EnumTypeThree Source { get; set; }
}
如果我实例化ChildA和ChildB的实例,它们每个都有一个具有不同值的静态enumerableProperties成员。真棒!
问题是我真的不知道幕后发生了什么。我对泛型的继承知之甚少。有人能告诉我这样做是怎么回事吗?
答案 0 :(得分:0)
您可以将泛型理解为单独类型的某种通用模板,它们的工作方式相同但不同。
在您的情况下,ChildA
继承自Parent<ChildA>
,ChildB
继承自Parent<ChildB>
。两种父类型Parent<ChildA>
和Parent<ChildB>
虽然不同,但ChildA
和ChildB
不具有共同的基本类型。
如果您确实将Parent<ChildA>
和Parent<ChildB>
声明为真正的单独类型,则可能更容易理解:
class Parent_ChildA { … }
class Parent_ChildB { … }
class ChildA : Parent_ChildA { … }
class ChildB : Parent_ChildB { … }
这就是幕后真正发生的事情。因此,两个父类型是不同的类型,这也解释了为什么它们具有单独的静态成员。毕竟,两个不同的类不会共享静态成员,即使它们具有相同的名称。