to elusion(落):看我的另一个帖子,接口没变。我刚试了试,在.Net2003,C++下就可以正确做到。#include "stdafx.h" class A { public: void Make(int a); };class B : public A { private: void Make(); };int _tmain(int argc, _TCHAR* argv[]) { B b; B.Make(3); // 编译错误 }
上面的打错了,完整的C++下实现我需要的功能的版本: #include "stdafx.h" class A { public: void Make(int a); };void A::Make(int a) { return; }class B : public A { public: void Make(int a, int b); };void B::Make(int a, int b) { return; };int _tmain(int argc, _TCHAR* argv[]) { B b; b.Make(3, 4); // b.Make(3); // 如果有这句就会d:\Project\Try2\Try2.cpp(33): error C2660: “B::Make” : 函数不接受 1 个参数}C#中如何做到类似功能
C++是基于名字的,C#是基于签名的。但这并不重要,你还是好好看看OO吧~~~~
面向对象语言的创造者不会允许这种情况发生的,至少目前不可能,原因就在于——用基类的指针(或引用)指向派生类的时候该如何办,如果我们允许派生类隐藏基类的方法,试考虑如下代码,public class Base { public void Foo() { } }public class HideBase : Base { private void Foo() { } // 如果允许我们隐藏基类的方法 Foo }public class Test { private void Main(string[] args) { Base b = null; int n = Console.ReadLine(); if(n < 0) b = new Base(); else b = new HideBase(); /* 如果允许我们像前面那样隐藏基类的 Foo 方法,那么此时怎么办?是允许调用呢(因为在 Base 类中 Foo 是 public 的,还是不允许呢(因为在 HideBase 中 Foo 是 private 的)?)*/ b.Foo(); } }同样的问题在虚函数里就更突出了。其实,我认为在 C++ 中允许派生类重写父类方法的访问级别在某种程度上其实是对面向对象编程的一种毁坏,因为它使得我们不能用基类的指针指向派生类的方法(当然是从基类继承来的方法),也破坏了多态。这就是为什么在 Java 和 C# 里都不允许改写父类方法的访问级别的原因。也许在将来某个时候,某个现有语言或未来语言会加入这个特性,但不是采用 C++ 的那种方法,因为 C++ 的这种方法容易使程序员忘了其实它们的类正在破坏面向对象和多态,这就使语言的发明者要发明一种新的语义的关键字,使使用它的程序员明确知道它们正在破坏面向对象的最主要方面——多态。
class A
{
public:
void Make(int a);
};class B : public A
{
private:
void Make();
};int _tmain(int argc, _TCHAR* argv[])
{
B b;
B.Make(3); // 编译错误
}
#include "stdafx.h"
class A
{
public:
void Make(int a);
};void A::Make(int a)
{
return;
}class B : public A
{
public:
void Make(int a, int b);
};void B::Make(int a, int b)
{
return;
};int _tmain(int argc, _TCHAR* argv[])
{
B b;
b.Make(3, 4);
// b.Make(3); // 如果有这句就会d:\Project\Try2\Try2.cpp(33): error C2660: “B::Make” : 函数不接受 1 个参数}C#中如何做到类似功能
{
public void Foo() { }
}public class HideBase : Base
{
private void Foo() { } // 如果允许我们隐藏基类的方法 Foo
}public class Test
{
private void Main(string[] args)
{
Base b = null;
int n = Console.ReadLine(); if(n < 0)
b = new Base();
else
b = new HideBase(); /* 如果允许我们像前面那样隐藏基类的 Foo 方法,那么此时怎么办?是允许调用呢(因为在
Base 类中 Foo 是 public 的,还是不允许呢(因为在 HideBase 中 Foo 是 private 的)?)*/
b.Foo();
}
}同样的问题在虚函数里就更突出了。其实,我认为在 C++ 中允许派生类重写父类方法的访问级别在某种程度上其实是对面向对象编程的一种毁坏,因为它使得我们不能用基类的指针指向派生类的方法(当然是从基类继承来的方法),也破坏了多态。这就是为什么在 Java 和 C# 里都不允许改写父类方法的访问级别的原因。也许在将来某个时候,某个现有语言或未来语言会加入这个特性,但不是采用 C++ 的那种方法,因为 C++ 的这种方法容易使程序员忘了其实它们的类正在破坏面向对象和多态,这就使语言的发明者要发明一种新的语义的关键字,使使用它的程序员明确知道它们正在破坏面向对象的最主要方面——多态。