提问人:Ninja 提问时间:8/30/2019 最后编辑:Vlad from MoscowNinja 更新时间:8/30/2019 访问量:2675
继承是否也会自动从其父级“继承”命名空间?
Does inheritance also automatically "inherit" namespaces from its parent?
问:
只是想问一些关于命名空间的一般问题。如果类 A 继承了类 B 并且没有显式引用 () B 的命名空间,我是否必须在调用代码中显式命名空间才能从 A 的实例调用 B 的方法?这种语言是否依赖于(C#、C++)?using
using B
例如,在 C# 中:
// Namespace X
class A : B
{
public void methodA(){...}
}
// Namespace Y
class B
{
public void methodB(){...}
}
在其他使用 A 的代码中:
using X;
// do I need using Y?
...
A obj = new A();
obj.methodB(); // calls methodB() using instance of A
...
答:
类不继承命名空间。 仅将命名空间中的符号导入到当前源文件中。它对你的班级本身没有影响。using
以下 C# 代码:
using System;
public class A {
public void Run() {
Console.WriteLine("Foobar");
}
}
无论是在发出的 CIL 中,还是在用户将如何使用或派生该类的方式中,其效果都与以下代码完全相同:A
public class A {
public void Run() {
System.Console.WriteLine("Foobar");
}
}
假设我们导入一个从方法返回的类型:
using System.IO;
public class A {
public Stream createStream() {
// implementation irrelevant
}
}
如果我们随后在另一个源文件中声明,则该方法被继承,并且它仍然返回 ,即使声明的源文件 B
没有 using System.IO
,并且 class 的用户不需要导入即可使用 ;系统知道完全合格的类型是 。class B : A
createStream()
System.IO.Stream
B
System.IO
createStream()
System.IO.Stream
public class B : A {
public void doSomethingWithStream() {
// We can use a System.IO.Stream object without importing System.IO
using (var s = createStream()) {
}
}
}
public class C {
public static void doSomethingElseWithStream(B b) {
// As can other stuff that uses B.
using (var s = b.createStream()) {
}
}
}
评论
不,没有继承的命名空间这样的东西。 命名空间没有任何可以派生/继承的内容。
如果要继承不同命名空间中的类 A,则需要添加“using namespace ...”
评论
using
using Y
using X
如果在命名空间和 中,则不能执行A
X
B
Y
// Namespace X
class A : B
{
...
};
您需要做:
class A : Y::B
{
...
};
所以你看你必须使用资格继承,那里没有什么特别的事情发生。顺便说一句,这是在C++中。B
如果需要更多的东西,它需要同样限定它。A
Y
任何使用的人都需要用它来限定它或导入所有内容,或者只是,取决于使用它 - 或 .不过,这对内部事物的可见性没有影响。A
X::A
A
using X::A;
using namespace X;
Y
唯一可能让您感到惊讶的是 Koenig Lookup,所以也许可以阅读一下。
评论
class A : Y::B
using Y
B
A
B
A
Y
C++ (和 C#) 中的类不会继承任何命名空间。但是,由于 ADL(参数相关查找),您可以从基类的命名空间中“继承”某些名称。
这是一个示范程序
#include <iostream>
namespace N1
{
struct A {};
void f( const A & )
{
std::cout << "N1::f( const A & )\n" << '\n';
}
}
namespace N2
{
struct B : N1::A
{
B() { f( *this ); }
};
}
int main()
{
N2::B b;
return 0;
}
它的输出是
N1::f( const A & )
若要“继承”命名空间,可以在命名空间或块作用域中使用 using 指令。例如
namespace N1
{
struct A {};
}
namespace N2
{
using namespace N1;
struct B : A
{
};
}
请注意,您不能在类作用域中使用 using 指令。
或者,您可以通过 using 声明仅引入某些名称。
评论
using namespace N1;
评论
using