gpt4 book ai didi

c# - 如何将公共(public)抽象类的子类化限制为同一程序集中的类型,从而允许将 protected 成员类型化为内部类型

转载 作者:太空宇宙 更新时间:2023-11-03 15:36:38 27 4
gpt4 key购买 nike

这个问题类似于c#内部抽象类,如何在外部隐藏用法,但我的动机不同。这是场景

我从以下几点开始:

internal class InternalTypeA {...}

public class PublicClass
{
private readonly InternalTypeA _fieldA;

...
}

以上编译正常。但后来我决定我应该提取一个基类并尝试编写以下内容:

public abstract class PublicBaseClass
{
protected readonly InternalTypeA _fieldA;

...
}

因此问题来了, protected 成员在程序集外部可见,但属于内部类型,因此无法编译。

手头的问题是我如何(或者我可以?)告诉编译器只有与 PublicBaseClass 位于同一程序集中的公共(public)类可以从它继承,因此 _fieldA 不会暴露在程序集之外?

或者有另一种方法来做我想做的事情,有一个公共(public)父类(super class)和一组公共(public)基类,它们都在同一个程序集中,并在它们的公共(public)(“ protected ”)中使用该程序集的内部类型代码?

到目前为止我唯一的想法是:

public abstract class PublicBaseClass
{
private readonly InternalTypeA _fieldA;

protected object FieldA { get { return _fieldA; } }

...
}

public class SubClass1 : PublicBaseClass
{
private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } }
}

public class SubClass2 : PublicBaseClass
{
private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } }
}

但这很丑陋!

最佳答案

CLR 提供了 FamilyAndAssembly 可访问性,它将执行您想要的操作,但 C# 中没有使用它的语法。

解决方法是将变量字段设为内部,您必须相信程序集中的代码不会不当访问它。

您还可以将 PublicBaseClass 的构造函数设为内部,这样只有您的程序集才能实例化它。这样,只有您的类才能继承它(即使该类本身是公共(public)的)

关于c# - 如何将公共(public)抽象类的子类化限制为同一程序集中的类型,从而允许将 protected 成员类型化为内部类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31674807/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com