【发布时间】:2018-08-25 22:54:42
【问题描述】:
我最近提出了一些相当时髦的单例工作,并发现我可以使用使用泛型的相同继承基础从任何唯一继承类型访问受保护的静态成员。我所说的一个例子如下:
public abstract class Class<T>
{
protected static int number = 5;
public void Print()
{
Console.WriteLine(number);
}
}
public class ClassA : Class<ClassA>
{
}
public class ClassB : Class<ClassB>
{
public ClassB()
{
number = 1;
}
}
public class ClassC : Class<ClassC>
{
public ClassC()
{
number = ClassA.number;//I don't want to be able to see "number"
}
}
由于这里使用了泛型,每个唯一的继承类型都有自己的“编号”(这是我想要的)。但是我不喜欢在使用泛型时我可以从继承相同基类型的其他类型访问“数字”。有没有办法来解决这个问题?还有为什么会发生这种情况(我理解为什么没有泛型的继承会发生这种情况,但泛型会发生这种情况似乎不对)?
【问题讨论】:
-
通常使用静态受保护变量是不好的做法。静态方法/变量的通常用例是无需实例化对象即可访问变量/方法。在这种情况下,将某些东西设为受保护或私有似乎很奇怪。如果您不介意我的询问,您的用例是什么?
-
您可以将静态字段设为私有,然后在抽象类中实现受保护的实例方法来获取/设置此静态字段的值(或使用等效的受保护属性)。这样,ClassB 的实例就无法访问 ClassA 的静态字段...
-
@CamiloTerevinto 不,这是相关的,因为泛型类中的
static变量仅对于给定的一组泛型类型是唯一的。也就是说,您可以更改Class<ClassA>.number的值,但这不会更改Class<ClassB>.number的值,因为Class<ClassA>和Class<ClassB>被视为两种独特的类型。 -
@juharr 呵呵,我们每天都在学习新东西。谢谢
标签: c# generics inheritance static protected