new public void Make(int a, int b)
{
this.b = b;
base.Make(a);
}

解决方案 »

  1.   

    public void Make(int a, int b)
    这里面的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欢迎大家使用,欢迎大家多多指教。
    /////////////////////////////////////////////////////////////////////
      

  2.   

    to thinkingforever(努力学习):
    我试了下,好像无效。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)??
      

  3.   

    呵呵.....慢慢来,欢迎到我们论坛来一起交流!=============================================================
    WWW.ITZYK.NET    IT资源库 ---->  专业的DoNet技术论坛
    =============================================================  
    www.itzyk.net 是一个刚刚创建起来的专业DoNet技术论坛,讨论与交
    流各种关于DoNet技术方面的信息,由于论坛正在起步阶段,需要大量
    高手,牛人们前来相助,特此诚邀各位兄弟姐妹们来参与论坛的建设,
    一起来打造属于我们的程序员们的专业技术论坛。
      

  4.   

    关键是这两个函数的参数是不同的,会被认为是函数重载。Make(int a);
    Make(int a, int b);所以在Make(int a, int b)上使用重写,override,new等方法并不能隐藏Make(int a);
      

  5.   

    public class 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);
    }
    }
      

  6.   

    to winxieddd(一剑飘香):改为protected肯定是不行的,不然使用类A的人怎么办?使用类A的人也要用Make呀。而且,类B的Make是公有的,那再从类B派生一个类C,再加一个参数,又会有同样的问题,类B的Make总得是公有的吧,不然外部类怎么使?public class C : B
    {
           protected int c;       public void Make(int a, int b, int c)
           {
                  this.c = c;
                  base.Make(a, b);
           }
    }又有同样的问题了。怎么办?
    我觉得这种功能可能不应该这样实现,但那应该怎么实现呢???
      

  7.   

    ?????????????????????????、傻了。在《Thinking In C++》2ed,第14章,有下面一段话:
    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#中是如何解决这个问题的??????
      

  8.   

    好象用“is a"没什么好的方法了,那就只好用"has a"了。
      

  9.   

    不会吧,我原来就是Has a 设计的,现在觉得应该是Is的关系,想变回来。这可不是个小问题呀,是C#中的BUG吗??,把所有应该用继承实现的都改为用合成实现,那所有的设计都可以Byebye了。那继承还有用吗?面向对象还有用吗?。。疯了~~~~~~~~~~我希望有解决的办法,这个问题应该很容易发现呀,不应该是Bug吧
      

  10.   

    public class A
    {
    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);
    }
    }
      

  11.   

    to sarcophile(食肉动物):
    这样还是不行呀,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
      

  12.   

    晕。还不对,private不是返回值晕了。那根据这句:
    方法签名由方法的名称和它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。需注意的是,方法签名既不包含返回类型,也不包含 params 修饰符(它可用于最右边的参数)。 看不出方法签名包含不包含函数类型这算是没有定义的问题??那还需要找个解决这个问题的方法
      

  13.   

    我在.Net2003的C++下正确的完成了我的要求:#include "stdafx.h"class A
    {
    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#中如何做到?
      

  14.   

    c#不是基于名字的,是基于方法签名的。想隐藏基类的重载方法是不可能的!(其实你也不需要隐藏)这是典型的滥用重载。问题本身就是错的,就不要说解决了。OO还没入门哦。要是一定解决的话,可应让基类实现一个接口,然后显式声明接口方法,这个方法标记为私有的即可了。
      

  15.   

    哈哈,感谢lihao9806(李昊),你的话终于让我看到了解决问题的希望。OK,你说的确实有道理,而且我也知道了如何用接口实现我需要的功能。另外,如果你能不这么刻薄的话,我想我会更崇拜你的,哈哈。再次感谢,给分