【问题标题】:Inheritance from Class and Interface从类和接口继承
【发布时间】:2013-02-25 03:52:50
【问题描述】:

我写了一个简单的类如:

public class Pusher : IPusher,Hub
{
}

我得到编译错误(Interface definition is expected)因为我们should首先从类继承然后其他接口。

但是public class Pusher : Hub,IPusherpublic class Pusher : IPusher,Hub 有什么区别

我们也可以在具有默认值的方法参数中看到这种对流

public void ExampleMethod(int required, string optionalstr = "default string")

我们应该在参数的最后一个定义默认值参数。

这和CLR有关吗?

【问题讨论】:

  • 回答你的第一个问题,没有区别,两次都是一样的。
  • 我不知道你在这里真正问的是什么。我看不到将基类放在接口前面的类定义和可选参数之间的联系。它们是不同的东西。
  • @TimSchmelter 非常感谢
  • 类似问题在这里:stackoverflow.com/questions/2059425/…

标签: c#


【解决方案1】:

嗯,在第一种情况下,这只是一个约定。为了更好的可读性和编译时检查的简单性,我希望该类应该放在首位。 但论点是另一种情况。想象一下,您为第一个参数指定默认值,而不是最新的参数。编译器应该如何检测你想说的话。

示例: int func(int a, int b = 10, int c) 然后你调用 func(10, 20); 这应该做什么?不能这么说。

编辑(示例 2): int func(int a, int b = 1, int c, int d = 2, int e) 并调用 func(1,2,3,4); 在这种情况下,不清楚哪个变量被省略了。 它可以是 B 和 D。

【讨论】:

  • 我只是在这里成为魔鬼的拥护者。 func(10, 20) 不能只打电话给func(a: 10, c: 20) 吗?
  • 好吧,在这个简单的情况下......是的......但有些情况下这是不可能的。使用带有显式命名参数的语法是更好的主意。
  • @Antonijn 是的,但这完全是一个不同的概念。 C# 支持可选参数和命名参数,但我可以自己使用可选参数而不必命名它们,这会破坏。
  • 再举一个例子:int func(int a, int b = 1, int c, int d = 2, int e) and call func(1,2,3,4);现在呢?
  • @MichaelStum 这不是我的意思。我的观点是它可以调用函数,将给定的参数分配给命名参数first,然后最后分配可选参数。我的观点与命名参数无关。
【解决方案2】:

不,它与 CLR 无关,这些是特定于语言的限制。

我无法确切找到为什么必须将继承的类放在接口之前,但这可能是为了清楚起见。该类只能从另一个类继承,但可以实现多个接口。如果您知道被继承的类总是放在第一位,就更容易看到发生了什么。

可选参数的排序更具实用性。 C# 不允许空参数作为可选参数的占位符,因此您必须将它们放在最后(否则只能使用命名参数调用方法)。你不能这样调用方法:

ExampleMethod(42, );

要使用可选值调用,只需在调用中省略它:

ExampleMethod(42);

因此,如果可选参数不是最后一个,它就不是可选的,因为你不能这样调用:

ExampleMethod(, 42);

【讨论】:

  • @ShahroozJefri:是的,这是规则,但它没有说明原因。我也没有在 MSDN 文档中找到任何原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
相关资源
最近更新 更多