【问题标题】:C# array of different objectsC# 不同对象的数组
【发布时间】:2013-06-28 08:35:38
【问题描述】:

我有 2 个类 B 和 D。我必须创建一个包含 4 个 B 类型元素和 2 个 D 类型元素的数组。我该怎么做?

B o1 = new B();
D o2 = new D();
B o3 = new B();
D o4 = new D();

数组应该是这样的:

array[0] = o1; array[1] = o2; array[2] = o3; array[3] = o4;

【问题讨论】:

  • 我很好奇 - 你需要这个做什么?
  • 我需要为考试而学习。并且在谷歌上找不到答案。 :)
  • 答案是:仅有意义,如果 B 和 D 继承自 A(类或接口),则创建 A 的数组。虽然 B 和 D 继承自 Object,但 Object 必须具有很少的属性在这里有用。
  • I am new to c#. I don't like it but I have to learn it. In PHP it's 10000 times easier; 我是 PHP 新手。我不喜欢它。 C# 简单 10000 倍;)
  • @Nolonar :))) 每个人都有自己的看法。

标签: c# arrays object


【解决方案1】:

如果除了object没有通用的基类,你只需要:

object[] array = new object[4];
array[0] = o1;
// etc

或单发:

object[] array = { o1, o2, o3, o4 };

要使用特定于 B 或 D 的成员,您需要在从数组中检索值时进行强制转换,例如

B b = (B) array[0];
b.SomeMethodDeclaredOnB();

如果 B 和 D 有 common 方法,您可以在两个类都实现的接口中声明这些方法,并更改数组的类型:

IBD[] array = new IBD[4];
array[0] = o1;
...
array[0].SomeMethodDeclaredInIBD();

或者:

IBD[] array = { o1, o2, o3, o4 };
...
array[0].SomeMethodDeclaredInIBD();

最后,解决这个问题:

我是 C# 新手。我不喜欢它,但我必须学习它。在 PHP 中,这要简单 10000 倍;

我敢肯定,如果我尝试使用 PHP,我会在完全相反的方向找到相同的体验。不要假设 C# 比 PHP“更糟”或更“难”——它只是不同,你一定会发现使用一种你不熟悉的语言比你的“舒适区”语言更难。

【讨论】:

  • 在 PHP 中是这样的: $array = array($o1, $o2, $o3, $o4);简单得多。之后我可以这样做:$array = "here is a string"。并且变量数组改变了它的类型。简单的。优雅的。在网上很容易找到:)
  • @PaulMoldovan:而且容易出错。不要低估静态类型的力量。还有一种更简单的方法可以在 C# 中一次性声明和填充数组 - 我将在其中进行编辑。
  • 也许你是对的。但等我通过这次考试后,我会回到正常的生活。 PHP 开发人员。 :P
  • @PaulMoldovan:我认为如果你不利用所获得的机会来扩展你的视野,这将是一个遗憾。从不同的角度看待发展总是有用的。但是,如果这真的就您而言只是达到目的的一种手段,那是您的决定。我只是觉得你错过了。
  • @PaulMoldovan:我想如果你严重滥用了dynamic 关键字,你可以假装C# 是一种动态类型的语言。但是,这会带来严重的性能损失,并使调试程序变得更加困难。此外,其他 C# 开发人员会拿着火把和干草叉来追随你。
【解决方案2】:
  • 或使用数组object[] array对象

  • 或更多 OOP 方法:

    公共类 B : IHolder { }

    公共类 D : IHolder { }

IHolder[]IHolders 的数组

【讨论】:

    【解决方案3】:

    我是 C# 新手。我不喜欢它,但我必须学习它。在 PHP 中,这要简单 10000 倍;

    你遗漏了最后一句话的一部分:“犯错误”。强类型有其优势。

    您可以让类 B 和 D 继承自一个公共基类或接口,如下所示:

    interface ISomeInterface
    {
        string CommonProperty { get; }
    }
    
    class B : ISomeInterface
    {
        public string CommonProperty { get; }
    }
    
    class D : ISomeInterface
    {
        public string CommonProperty { get; }
    }
    
    ISomeInterface[] array = new ISomeInterface[]
    {
        o1,
        o2,
        o3,
        o4
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      相关资源
      最近更新 更多