覆盖另一个程序集中的内部抽象方法

Posted

技术标签:

【中文标题】覆盖另一个程序集中的内部抽象方法【英文标题】:Overriding an internal abstract method in another assembly 【发布时间】:2011-09-10 02:36:16 【问题描述】:

我目前正在处理一个使用另一个 .net 库的 c# 项目。该库确实(除其他外)将序列解析为树。所有项目都是从抽象类Sequence 继承的某种类型。我需要稍微改变行为并自己将Sequence 子类化(我们称之为MySequence)。创建树后,我可以用我自己的类的对象替换一些树节点。

现在,该库的新版本发布了,并引入了具有以下签名的Copy 函数:

internal abstract Sequence Copy();

我尝试将我的代码采用到新版本并覆盖它,但无论我在做什么,我都会收到两个错误:

MySequence 没有实现继承的抽象成员'Sequence.Copy()' 和:MySequence.Copy()':找不到合适的方法来覆盖

这是有道理的,因为它是抽象的(--> 它必须被覆盖)和内部的(--> 它不能被覆盖,因为从程序集外部隐藏可见性)

所以,问题是,我理解为什么会发生这种情况,但不知道该怎么做。对我的项目进行子类化Sequence 至关重要。

我也不明白的是,为什么首先允许使用 internal abstract 修饰符,因为它基本上允许从程序集外部对整个类进行任何子类化!?

有没有办法解决这个问题?通过反射什么的?

提前致谢!

【问题讨论】:

相关:***.com/questions/2303591/… 【参考方案1】:

这个修饰符意味着该类只能在定义它的程序集中被继承。

没有办法解决。

【讨论】:

还有一个问题:为什么c#中允许internal abstract?真的有人打算引入一种方法来使类从外部“不可子类化”吗?为此使用类修改器会更有意义吗? @Philip:那个修饰符会叫什么? internal abstract 很好。 事实上,我希望 C# 也允许 private abstract 成员。 @Philip Daubmeier:我回答了这个问题。允许防止任何人直接从包含该internal abstract 成员的类型派生。 @SLaks。 private abstract 成员有什么用?我在这里可能弄错了,但我相信包含这样一个成员的类型的实例永远不会被实例化......【参考方案2】:

基本上,如果不更改库,您将不走运。可能有一个实现 Copy 的 Sequence 子类,您可以在新版本中派生该子类。但很可能需要在库的其他部分使用 Copy 方法来创建克隆。

【讨论】:

我已经考虑过了。看来这是我唯一的选择了。 最后,问题解决了:我只是继承了一个非抽象类,它与我的实现非常相似,并且也继承自Sequence。我重写了所有方法以获得与过去相同的行为。感谢您的回答!【参考方案3】:

如果一个库有一个类型的成员带有修饰符internal abstract,我的结论是该库的开发人员不希望任何人从该类型派生他们自己的类型。您无法解决此问题。

您可以考虑这样做是否是故意的。你应该问出版商。这可能是一个错误,在这种情况下,发布者可能会发布修复程序。如果是故意这样做的,您应该提出一个替代解决方案,而不是从该类型派生。 编辑:或者他们可能打算让您仅从已实现该成员的同一程序集中的派生类型派生。

【讨论】:

以上是关于覆盖另一个程序集中的内部抽象方法的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE--抽象类内部类接口

如果我们可以简单地覆盖超类的方法或使用抽象类,为啥还要使用接口? [复制]

多态—虚方法抽象类接口

子类的方法必须覆盖父类的抽象方法

Java复习_4 接口多态和内部类

非抽象且不覆盖抽象方法 - IDL