抽象类中内部抽象方法的目的是什么? 为什么要在抽象类中内部创建抽象方法?如果我们想限制汇编之外的抽象类,为什么我们不只是创建抽象的内部类。 它背后是否还有其他逻辑。
答案 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中创建了多少个类,你都无法访问它,因为它是声明内部。