【发布时间】:2018-10-16 20:36:20
【问题描述】:
在表达对preventing exposure of base classes 的关注时,我了解到(通过测试)public 类不能从internal 类继承;但是,public 类可以从internal 接口继承。我真的很好奇为什么这是可能的。我相信这可能是由于以下之一(或任何组合):
- 接口只包含必须实现的签名。
- 类可能具有可通过派生类型访问的属性、方法等。
- 一个类可能有可以被派生类型覆盖的方法。
案例一
我相信,由于接口只是一个契约,其中包含签名并声明派生类型必须实现这些签名,因此允许继承。这是因为接口不关心谁访问了这些签名,只关心派生类型实现它们。
案例 2 和 3
与interfaces 不同,类可以具有public 可以被派生类型访问的属性。例如:
private class A {
public int SomeProperty { get; set; } = 0;
}
public class B : A {
// Some cool code.
}
public class C : B {
public int MyInt => SomeProperty;
}
这个结构的可访问性不一致,因为SomeProperty 是public,并且可以被所有派生类型访问;因此A 和B 必须具有相同的访问级别以防止暴露。
这就是为什么 public 类可以派生自 internal interface 而不是 internal class 的原因,还是我遗漏了什么?另外,还有什么其他原因可以做到这一点吗?
注意
我不是在寻找基于意见的答案;我正在寻找技术上正确的原因。
这不是重复的,因为我想知道为什么你不能从一个派生,但你可以从另一个派生。
【问题讨论】:
-
注意:公共类不能从隐式实现的内部接口中导出。
-
似乎有点回避这个问题。公共类不允许实现内部类即使没有一个内部类成员是非内部的。所以限制发生在替换之前(并且更普遍)。
-
@CSharper 虽然读得很好,但它确实没有回答我的问题。
-
@user2864740 如果我的理解正确,
public class必须显式实现接口才能工作?
标签: c# inheritance