Вы можете добавить конструктор private
к классу A<T>
и объявить два соответствующих класса: A_int
и A_double
внутри , чтобы иметь возможность наследовать их от A<T>
- они становятся "дружелюбный" до A<T>
. Но для классов, объявленных вне этой области (Test
class), это невозможно, как и для прямого создания из-за конструктора private
, который мы должны вызывать, но не можем. Таким образом, на практике у вас будет только два варианта A<T>
, дополненных время компиляции уведомления о недопустимых использованиях:
public class A<T> where T : struct
{
//constructor surely can have arguments
private A()
{
}
public T property { get; set; }
//and other common stuff
//each class declaration below we can treat like "where" constraint
public class A_int : A<int> { }
public class A_double : A<double> { }
}
//compile time error:
//'A<bool>.A()' is inaccessible due to its protected level
public class Test : A<bool>
{
}
Использование:
using static NameSpaceName.A<int>;
//you should not care about <int> - it is only needed for compiler
//and won't have any influence
var intVar = new A_int();
var doubleVar = new A_double();
//compile time error:
//'A<decimal>.A()' is inaccessible due to its protected level
var decimalVar = new A<decimal>();