阻止访问构造函数/仅特定 class 可以访问
Prevent access to constructor / only specific class has access
假设我有一个 Apple Class
和一个 AppleFactory
Class。
没有人应该能够使用 Apple redApple = new Apple()
。相反,新苹果应该只能从 AppleFactory.Create()
创建。
这意味着除了 AppleFactory Class。
如何做到这一点?
编辑:Apple
更像是 AppleModel
。所以那里只有属性。
你可以使Apple
抽象,然后在AppleFactory
.
中创建一个private
子类
但是,您不能阻止其他人创建自己的子类。
如果你想一个不同的类型作为工厂,那么最接近的是internal
:
public sealed class Apple() {
internal Apple() {}
}
public class AppleFactory() {
public Apple CreateApple() => new Apple();
}
但是,如果您可以将工厂作为 Apple
上的静态方法,那么您可以保留所有内容 private
:
public sealed class Apple() {
private Apple() {}
public static Apple Create() => new Apple();
}
你可以让 Apple
class 成为它自己的工厂。
public class Apple
{
private Apple()
{}
internal static Apple Create()
{
var apple = new Apple();
// TODO: Initialize
return apple;
}
}
真正的苹果工厂可以调用这个工厂方法:
public class AppleFactory() {
public CreateApple() => Apple.Create();
}
通过将 Apple.Create()
设为内部,您可以将其使用限制在当前程序集中。无论如何只能调用构造函数 insde Apple
,因为它是 private
.
假设我有一个 Apple Class
和一个 AppleFactory
Class。
没有人应该能够使用 Apple redApple = new Apple()
。相反,新苹果应该只能从 AppleFactory.Create()
创建。
这意味着除了 AppleFactory Class。
如何做到这一点?
编辑:Apple
更像是 AppleModel
。所以那里只有属性。
你可以使Apple
抽象,然后在AppleFactory
.
private
子类
但是,您不能阻止其他人创建自己的子类。
如果你想一个不同的类型作为工厂,那么最接近的是internal
:
public sealed class Apple() {
internal Apple() {}
}
public class AppleFactory() {
public Apple CreateApple() => new Apple();
}
但是,如果您可以将工厂作为 Apple
上的静态方法,那么您可以保留所有内容 private
:
public sealed class Apple() {
private Apple() {}
public static Apple Create() => new Apple();
}
你可以让 Apple
class 成为它自己的工厂。
public class Apple
{
private Apple()
{}
internal static Apple Create()
{
var apple = new Apple();
// TODO: Initialize
return apple;
}
}
真正的苹果工厂可以调用这个工厂方法:
public class AppleFactory() {
public CreateApple() => Apple.Create();
}
通过将 Apple.Create()
设为内部,您可以将其使用限制在当前程序集中。无论如何只能调用构造函数 insde Apple
,因为它是 private
.