【问题标题】:c# ways to create the object [closed]c#创建对象的方法[关闭]
【发布时间】:2018-04-18 19:51:05
【问题描述】:
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 //<=
}

那么这个带有指示符(

【问题讨论】:

    标签: c# oop


    【解决方案1】:

    您的代码无法编译,用户@SamiKuhome 提供的dotnetfiddle 所描述的错误实际上非常详细地说明了原因。

    无法通过引用转换、装箱转换、拆箱转换、包装转换或空引用转换将类型“a”转换为“b”

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

    回答您的问题:“如果可能,请说明使用它的目的和优势是什么?”

    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 abc 都将被认为在 common 中有 a。在现实世界中,我们看到这是由科学领域建模的(这就是“类”一词的来源:分类):某物可能是“动物”(a),但这不是很具描述性。为了进一步说明我们正在处理的动物类型(在这种情况下,bc - 可能是海豚和猫)。

    所有这些动物可能有共同点:这将被视为a 的特征。

    分类使用规则

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

    为什么?

    当代码使用a 的对象或实例时,它只想与该特定类型进行交互或仅与该特定类型进行约定。编译器只知道a 类型是a

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 2019-12-24
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      相关资源
      最近更新 更多