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

时间:2015-02-24 05:33:39

标签: c#

抽象类中内部抽象方法的目的是什么? 为什么要在抽象类中内部创建抽象方法?如果我们想限制汇编之外的抽象类,为什么我们不只是创建抽象的内部类。 它背后是否还有其他逻辑。

3 个答案:

答案 0 :(得分:9)

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方法。

答案 1 :(得分:6)

  

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双向飞碟从C#深入阅读c#中的访问修饰符概念。

答案 2 :(得分:1)

想象一下,您的项目中有代码

让我们说它是一个控制台应用程序,我们称之为ConsoleApplication1

      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(){}

          }
       }

现在你有了(比如说另一个名为ConsoleApplication2的consoleApp)你构建consoleapplication1并添加对它的引用

  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()

为什么会出现这个错误?因为编译器告诉你,当你将member声明为internal时,同一个程序集中的类即(ConsoleApplication1)可以访问它。所以无论你在ConsoleApplication2中创建了多少个类,你都无法访问它,因为它是声明内部