我使用了 Visual Studio Code 的 Polyglot 笔记本,并按照下面指示的顺序在 3 个单独的单元格中写入了以下内容。
单元格 1:
class Z;
单元格2:
class A
{
public static void f()
{
Console.WriteLine(Z.x);
}
}
单元格 3:
class Z: A
{
public static int x = 42;
}
然后我按顺序执行了这些单元格,并收到以下错误消息。
'Z' does not contain a definition for 'x'
我原来的问题是:
在 C# 中,是否可以编写一个(可能是抽象的)类
A
,该类具有签名为 的(可能是静态的)函数void f(B b)
,其参数的类型B
是从A
(class B: A {...}
) 派生的(可能是抽象的)类? 如果不能,为什么不能?
标题是“ C# 类可以使用派生类吗?”
我根据这个表述接受了下面的答案。这个表述后来被另一个编辑我的问题的用户删除,并更改了标题。
笔记本逐个执行单元格。因此,当您执行单元格 2 时,
Z
它只是一个class
,没有任何 的概念x
。这就是您收到错误的原因。目前还不清楚您真正想要什么行为。当然,您可以将整个代码写入单个单元格中:
因此,您的问题与继承无关,而是与 Polyglot 如何执行单元有关。不过请注意,您的方法非常奇怪。基类不应该对派生类做出任何假设,它甚至不应该知道存在任何派生类。然而,这更像是一个概念问题,对于这个问题的范围来说太宽泛了。
是的,当然。这是完全有效的:
当然,这两个类需要位于同一个程序集中,因为它们需要彼此了解。另一个问题是相关用例,我发现很难想象。通常,如果 A 是抽象的,您将返回 A 的(然后需要是 A 的派生类型),而不是 B 的,因为这会阻止您以后创建从 A 派生并替换 B 的类 C。
对的,这是可能的。
这是一个完全符合您要求的示例:
输出:
现场演示
注意:
既然你问了,
A
和/或B
也可以是抽象的。更新:
在给出此答案后,对问题进行了编辑,并增加了有关 Polyglot 笔记本用法的更多详细信息。
关于此附加信息:问题与笔记本逐个执行单元的方式有关。这不是与 C# 总体或特定继承用法相关的问题。