new public void Make(int a, int b)
{
this.b = b;
base.Make(a);
}
{
this.b = b;
base.Make(a);
}
解决方案 »
- Excel.Application excel = new Excel.Application()抛出异常???
- 如何获得DataGridView的选中行
- 谁给介绍一个参考源码
- C#小问题
- C#入门经典里面的源代码有问题啊
- 急!!!!!大虾帮帮忙!!list<T>能用索引吗???
- 求一个字符串转换成数组的方法,估计要用正则表达式
- 请教关于c#桌面程序(也就是c/s程序)调用打印机时报错是什么回事?该怎样解决这问题?谢谢!
- WCF如何传大量数据
- WinForm里面这样的边框是怎么实现的?
- 为什么我一用lucene.net类库时,建索引的时候一下子,就CPU资源就占用100%,难道类库,有问题吗?我用的是最新的lucene.net类库v1.3final版的
- 如何在派生类中彻底隐藏基类中的方法,使得派生类的使用者及它的派生类中都看不到基类的方法
这里面的a与b都是形势参数,与具体的变量没有关系
/////////////////////////////////////////////////////////////////////
欢迎大家使用编程文档手册V3.25,编程辅助类软件 集编程文档的收集、查询、浏览、编辑等功能于一体的辅助编程类软件。通过日积月累,相信本软件将给广大程序开发人员以及编程爱好者们带来很大的帮助。下载地址:
天空软件站:http://www.skycn.com/soft/11906.html
华军软件园:http://www.onlinedown.net/soft/6496.htm
详细说明与注册地址:http://www.sharebank.com.cn/soft/soft_view.php?id=10648
官方网站:http://promanual.jijun.org
工作室站点:http://www.jijun.org欢迎大家使用,欢迎大家多多指教。
/////////////////////////////////////////////////////////////////////
我试了下,好像无效。B里的Make和A里的Make参数不同,new并不能隐藏A里的Make。to blow_jj(阿俊) :
??我的意思是。
现在定义B bb = new B();
bb.Make(1); 这个应该是不行的,因为B类里有2个参数,Make它应该用2个参数的Make,1个参数的从A继承的Make应该是不行的,但A里1个参数的Make函数是公有的,被自动继承到了B类。现在如何隐藏从A继承到的Make,使得不能bb.Make(1)??
WWW.ITZYK.NET IT资源库 ----> 专业的DoNet技术论坛
=============================================================
www.itzyk.net 是一个刚刚创建起来的专业DoNet技术论坛,讨论与交
流各种关于DoNet技术方面的信息,由于论坛正在起步阶段,需要大量
高手,牛人们前来相助,特此诚邀各位兄弟姐妹们来参与论坛的建设,
一起来打造属于我们的程序员们的专业技术论坛。
Make(int a, int b);所以在Make(int a, int b)上使用重写,override,new等方法并不能隐藏Make(int a);
{
protected int a; protected void Make(int a) //此处改为protected
{
this.a = a;
}
} public class B : A
{
protected int b; public void Make(int a, int b)
{
this.b = b;
base.Make(a);
}
}
{
protected int c; public void Make(int a, int b, int c)
{
this.c = c;
base.Make(a, b);
}
}又有同样的问题了。怎么办?
我觉得这种功能可能不应该这样实现,但那应该怎么实现呢???
and Derived4 shows that changing the
argument list also hides both the base class versions. In general, we
can say that anytime you redefine an overloaded function name
from the base class, all the other versions are automatically hidden
in the new class.这段话上面的例子(节选了有意义的):
#include <iostream>
#include <string>
using namespace std;
class Base {
public:
int f() const {
cout << "Base::f()\n";
return 1;
}
int f(string) const { return 1; }
void g() {}
};class Derived4 : public Base {
public:
// Change argument list:
int f(int) const {
cout << "Derived4::f()\n";
return 4;
}
};int main() {
string s("hello");
Derived1 d1;
int x = d1.f();
Derived4 d4;
//! x = d4.f(); // f() version hidden
x = d4.f(1);
} ///:~上面的例子也显示了,在C++中,继承的类中如果有基类同名的函数,但参数不同,会自动隐藏基类中所有同名的其它函数!!!!但C#中为什么不是这样??????????那C#中是如何解决这个问题的?????代码是我在C#中的测试你们试试,下面这段代码,可以运行呀!!!!!!using System;
//
namespace EventSample
{
public class A
{
protected int a; public void Make(int a)
{
this.a = a;
}
} public class B : A
{
protected int b; public void Make(int a, int b)
{
this.b = b;
base.Make(a);
}
} public class Try
{
public static void Main (string[] args)
{
B bb = new B(); bb.Make(1); Console.ReadLine();
}
} B中还是能调用基类的函数呀疯了~~~~C#中是如何解决这个问题的??????
{
protected int a; virtual public void Make(int a)
{
this.a = a;
}
} public class B : A
{
protected int b; public override void Make(int t)
{
return; // 或 throw new Exception("...");
}
public void Make(int a, int b)
{
this.b = b;
base.Make(a);
}
}
这样还是不行呀,B中的Make(int t)还是public的,使用者可以看到。如果像我上面这样继续10次,最后一个类中就会有10个公有的Make方法,而其中只有一个是能使的,另外9个都直接返回return!!这种设计这不可能接受吧。
现在我的希望放在new这个修饰符上,但这个修饰符的实现在2003好像有bug。谁机子上有2002和2005,看看上面的代码是不是在这2个版本上不能通过?选自MSDN:
使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。
引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。/*同时也隐藏具有相同签名的所有基类方法*/。(!!!!!!!!!!!!!!!!注意上面这句)有关更多信息,请参见 3.6 签名和重载。
方法、实例构造函数、索引器和运算符是由它们的签名来刻画的:
方法签名由方法的名称和它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。需注意的是,/*方法签名既不包含返回类型*/,也不包含 params 修饰符(它可用于最右边的参数)。 (!!!!!!!!!!!!!!!!!!!注意上面这句)
由于按照MSDN,new修饰符可以隐藏具有相同签名的所有基类方法,而方法的签名指每个形参的类型和种类,但不包含返回类型,因此在B类中,像下面这样写就应该可以隐藏A中的Make函数: public class B : A
{
protected int b; new private void Make(int t)
{
return;
} public void Make(int a, int b)
{
this.b = b;
base.Make(a);
}
}
注意类A中的Make在B中被重新声明为private类型,因此外部类和派生类就不能访问这个函数。而由于方法的签名和返回类型无关,所以new修饰符应该可以隐藏基类的Make函数。但可惜的是在2003版本中,这个方法无效,声明为private类型后,new修饰符就不能正确的隐藏基类的Make,不知道在2002和2005版本中是不是还有这个办法。如果没有别的办法解决这个问题,那这可能是一个BUG
方法签名由方法的名称和它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。需注意的是,方法签名既不包含返回类型,也不包含 params 修饰符(它可用于最右边的参数)。 看不出方法签名包含不包含函数类型这算是没有定义的问题??那还需要找个解决这个问题的方法
{
public:
void Make(int a){};
};class B : public A
{
public:
void Make(int a, int b){};
// void Make(int a) {A::Make(a);}; // 如果想恢复被隐藏的Make,加上这句就行
};int _tmain(int argc, _TCHAR* argv[])
{
B b;
b.Make(3, 4);
// b.Make(3); // 加上这句,就会d:\Project\Try2\Try2.cpp(26): error C2660: “B::Make” : 函数不接受 1 个参数}C#中如何做到?