抽象类中内部抽象方法的目的是什么

本文关键字:是什么 抽象方法 内部 抽象类 | 更新日期: 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 中创建多少个类,您都无法访问它,因为它被声明为内部