抽象类中内部抽象方法的目的是什么
本文关键字:是什么 抽象方法 内部 抽象类 | 更新日期: 2024-07-27 10:45:56
抽象类中内部抽象方法的目的是什么?为什么要在抽象类中使抽象方法成为内部方法?如果我们想在程序集之外限制抽象类,为什么我们不直接创建抽象内部类。这背后还有其他逻辑吗?
将internal
成员添加到public
抽象类中,就无法在声明该类的程序集之外继承该abstract
类。但是类本身以及所有派生类仍然可以在声明汇编之外使用(因为类型public
(。
假设你有一个抽象类:
public abstract AMyClass
{
public string DoSomething()
{
return DoSomethingInternal();
}
internal abstract string DoSomethingInternal();
}
以及继承它的另一个公共类,在同一程序集中声明
public sealed MyClass : AMyClass
{
internal override string DoSomethingInternal()
{
return "Hey from MyClass!";
}
}
您仍然可以在不同的程序集中创建MyClass
的实例,但您将无法实现自己的派生自AMyClass
的类,因为您将无法实现抽象DoSomethingInternal
方法。
internal 关键字是类型和类型成员的访问修饰符。 内部类型或成员只能在同一文件中访问 程序集,如本例所示
public class BaseClass
{
// Only accessible within the same assembly
internal static int x = 0;
}
现在在您的情况下,这是这样的:
public abstract BaseClass
{
internal abstract void Print();
}
现在,在这种情况下,位于 BaseClass 同一程序集中的所有类将能够重写 BaseClass 的 Print 方法。但在程序集之外,类将只能重写公共成员。喜欢
public abstract BaseClass
{
internal abstract void Print();
public abstract void Hello();
}
BaseClass 程序集之外的类将无法使用此类,因为此类的成员之一是内部成员。解决方案是在 BaseClass 的同一程序集中创建子类,并在程序集外部使用该类。
我建议您通过 @john skeet 深入阅读 C# 中的 C# 中的访问修饰符概念。
假设你的项目中有一个代码
假设它是一个控制台应用程序,我们将其称为控制台应用程序1
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{}
}
public abstract class MyAbsClass
{
public string DoSomething()
{
return DoSomethingInternal();
}
internal abstract string DoSomethingInternal();
public abstract string DoSomethingExternal();
}
public class MyClass:MyAbsClass
{
internal override string DoSomethingInternal(){}
public override string DoSomethingExternal(){}
}
}
现在你有(假设另一个叫做控制台应用程序 2(你构建你的控制台应用程序 1 并添加对它的引用
using ConsoleApplication1;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
}
}
class NewClass : MyAbsClass
{
public override string DoSomethingExternal()
{
throw new NotImplementedException();
}
}
}
现在,当您构建此内容时,会出现错误Error 1 'ConsoleApplication2.NewClass' does not implement inherited abstract member 'ConsoleApplication1.MyAbsClass.DoSomethingInternal()
为什么会出现此错误??因为编译器告诉您,当您将成员声明为内部时,同一程序集中的类(即(ConsoleApplication1(可以访问它。因此,无论您在 ConsoleApplication2 中创建多少个类,您都无法访问它,因为它被声明为内部。