c#创建对象的方法

时间:2017-11-06 15:37:42

标签: c# oop

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; =)的语句标记会执行吗?如果可能的话还告诉我们使用它的目的和优势是什么?

1 个答案:

答案 0 :(得分:0)

您的代码无法编译,用户@SamiKuhome提供的dotnetfiddle所描述的错误实际上对于原因具有极大的描述性。

  

无法转换类型&#39; a&#39;到&#39;&#39;通过引用转换,装箱转换,拆箱转换,换行转换或空引用转换

简而言之,编译器不知道如何在类型ab之间进行转换,因为类之间没有关系。

回答你的问题:&#34;如果可能的话,还要说明使用它的目的和优点?&#34;

为了使您的代码有效,您需要在两个类ab之间建立关系。在这里,我们假设类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。然后,bc都会被认为在 common 中有a。在现实世界中,我们看到这是由科学领域建模的(这就是“#34;类&#34;来自:分类”这个词:某些东西可能是一个动物&#34; (a),但这不是非常具有描述性的。我们想进一步说明我们正在处理的动物类型(在这种情况下,bc - 可能是海豚和猫)。

所有这些动物可能有一些共同之处:它们有呼吸机制 - 或其他东西。这将被视为a的特征。

使用分类规则

编程语言非常注重分类如何相互协作来描述关系。您的代码可能无法以其他语言编译(如果维持上述关系),并且 - 至少 - 会生成警告。

为什么?

当代码使用a的对象或实例时,它只希望与该特定类型进行交互 - 或者仅与其签订合同。所有编译器都知道类型a是类型a

投射到更具体的类型通常被认为是危险的(这并不意味着它没有完成)。

bc都满足a要求 - 它们都共享分类;但是,在运行时,我们无法确定我们遇到的a的每个实例确实都是特定的规范。我们可能会看到bc。并且 - 我们可以想象 - 迫使海豚成为一只猫并不是特别有意义(或者真的可能)。

如果您想了解更多有关这些概念背后的动机,请查看Liskov's Substitution Principle