public class a(){
public void test(){
console.writeline("test");
}
}
public class b(){
public void test(){
console.writeline("test");
}
}
public class main(){
a testa =new a();
b testb = testa as b //<=
}
这个带有指示符(&lt; =)的语句标记会执行吗?如果可能的话还告诉我们使用它的目的和优势是什么?
答案 0 :(得分:0)
您的代码无法编译,用户@SamiKuhome提供的dotnetfiddle所描述的错误实际上对于原因具有极大的描述性。
无法转换类型&#39; a&#39;到&#39;&#39;通过引用转换,装箱转换,拆箱转换,换行转换或空引用转换
简而言之,编译器不知道如何在类型a
和b
之间进行转换,因为类之间没有关系。
回答你的问题:&#34;如果可能的话,还要说明使用它的目的和优点?&#34;
为了使您的代码有效,您需要在两个类a
和b
之间建立关系。在这里,我们假设类b
是类a
的规范:
public class a
{
public void test()
{
console.writeline("test");
}
}
public class b extends a // note change, here
{
public void test()
{
console.writeline("test");
}
}
在这种情况下,我认为最容易考虑一组课程;例如,您可能还有c
的课程extends a
。然后,b
和c
都会被认为在 common 中有a
。在现实世界中,我们看到这是由科学领域建模的(这就是“#34;类&#34;来自:分类”这个词:某些东西可能是一个动物&#34; (a
),但这不是非常具有描述性的。我们想进一步说明我们正在处理的动物类型(在这种情况下,b
和c
- 可能是海豚和猫)。
所有这些动物可能有一些共同之处:它们有呼吸机制 - 或其他东西。这将被视为a
的特征。
编程语言非常注重分类如何相互协作来描述关系。您的代码可能无法以其他语言编译(如果维持上述关系),并且 - 至少 - 会生成警告。
为什么?
当代码使用a
的对象或实例时,它只希望与该特定类型进行交互 - 或者仅与其签订合同。所有编译器都知道类型a
是类型a
。
投射到更具体的类型通常被认为是危险的(这并不意味着它没有完成)。
b
和c
都满足a
要求 - 它们都共享分类;但是,在运行时,我们无法确定我们遇到的a
的每个实例确实都是特定的规范。我们可能会看到b
和c
。并且 - 我们可以想象 - 迫使海豚成为一只猫并不是特别有意义(或者真的可能)。
如果您想了解更多有关这些概念背后的动机,请查看Liskov's Substitution Principle。