测试代码如下:    abstract class A
    {
        protected abstract void Test();
    }    class B : A
    {
        protected override void Test()
        {
            throw new NotImplementedException();
        }
    }    class C : B
    {
        protected override void Test()
        {
            C c = new C();
            // 可以调有c.Test()函数,但是上面的 b.Test()不能被调用。            B b = new B();
            // 无法调用 b.Test()这个函数,请问如何调用?            
        }
    }
注:
由于设计的原因, Test()函数必须是protected的。不能使用public或internal.

解决方案 »

  1.   

        abstract class A
        {
            protected abstract void Test();
        }    class B : A
        {
            protected override void Test()
            {
                throw new NotImplementedException();
            }
        }    class C : B
        {
            protected override void Test()
            {
                C c = new C();
                // 可以调有c.Test()函数,但是上面的 b.Test()不能被调用。            B b = new B();
                base.Test();
                // 无法调用 b.Test()这个函数,请问如何调用?            
            }
        }
      

  2.   

    既然已经是protected方法了,那就不能被 实例化对象调用了,可以在子类中用base.Method()调用
      

  3.   


    不对哈,那个base.Test()调用的不是b这个instance里的Test,改变了代码的逻辑了.  :)
      

  4.   

    支持2楼
    你在C中看不到B 的 protected方法。
      

  5.   

    这种情况你必须在class b 里面写一个public 方法。这个方法调用test这个方法。
      

  6.   

    确实是一个比较纠结的问题。 因为是一个开发库,不希望用户或其它的代码维护人员可以直接在外部调用这个Test方法。我知道是不能直接调用的,就是想找个好的办法来绕过这个问题。这里有个链接碰到跟我一样的问题,也说了原因,但是没说解决办法:http://blogs.msdn.com/b/abhinaba/archive/2005/11/10/491169.aspx
      

  7.   

     abstract class A
        {
            protected abstract void Test();
        }    class B : A
        {
            protected override void Test()
            {
                Console.WriteLine("B.Test()");
            }
        }    class C : B
        {
            protected override void Test()
            {
               // C c = new C();
                // 可以调有c.Test()函数,但是上面的 b.Test()不能被调用。            //B b = new B();
                base.Test();
                // 无法调用 b.Test()这个函数,请问如何调用?            
            }
            public void GetTest()
            {
                Test();
            }
        }    class Program
        {        static void Main(string[] args)
            {
                C c = new C();
                c.GetTest();
                Console.ReadKey();
            }
        }
      

  8.   

    看来只能认命了,想kingdom_0说的那样吧。加个比较诡异命名的 public A.__Test() 以及注释来告诉其他开发人员好了.. -_-|示例代码如下:    abstract class A
        {
            protected abstract void Test();        // __Test()只能被继承类的API中调用。
            public void __Test();
        }    class B : A
        {
            protected override void Test()
            {
                throw new NotImplementedException();
            }
        }    class C : B
        {
            protected override void Test()
            {
                C c = new C();
                c.__Test();
                // 可以调有c.Test()函数,但是上面的 b.Test()不能被调用。            B b = new B();
                b.__Test();
                // 无法调用 b.Test()这个函数,请问如何调用?            
            }
        }
      

  9.   

    晕,不能编辑了,上面的代码没对,把
    public void __Test();改成:        public void __Test()
            {
                Test();
            }
      

  10.   


    将protected改成internal是否可以呢?至少这个方法只能在你的程序集中调用了,外部看不到你这需求有点过分了。嘿嘿
      

  11.   

    是啊,但是还有其它的程序员要跑过来维护的。比如这个Project里 Module#1和Module#2,而上述的示例的代码是在Module#1中,如果是用internal的话,我又是担心他们在Module#2中用到Module#1的Instance的时候直接调用了Test()方法。所以现在就想直接跟他们约定一些特殊的函数名前缀,比如 双下划前"__"前缀 表示该函数不能被继承树之外的类中调用。
      

  12.   

    [EditorBrowsable(EditorBrowsableState.Never)]
    用这个标记在编辑器中隐藏如何?
      

  13.   


    这个Attribute是对UI设计器起做用的,在这里好像用不上。
      

  14.   


    Browsable才是设计器的,这个是VS代码编辑器的。
    这个属性可以让指定的方法,在编辑器中隐藏。this.不出现
      

  15.   

    7 楼不是给了方法了么   abstract class A
        {
            protected abstract void Test();
        }    class B : A
        {
            protected override void Test()
            {
                Console.WriteLine("B.Test()");
            }
        }    class C : B
        {
            protected override void Test()
            {
                Console.WriteLine("C.Test()");            
            }
            public void GetBaseTest()
            {
                base.Test();
            }
            public void GetThisTest()
            {
                this.Test();
            }
        }    class Program
        {        static void Main(string[] args)
            {
                C c = new C();
                c.GetBaseTest();
                c.GetThisTest();
                Console.ReadKey();
            }
        }
    输出 :B.Test()
    C.Test()
      

  16.   

    回#21楼:是的,我看到7楼说的方法了。我后来说的也是照着她的方法改的。其实我压根就不想让他人可以Main()中可以调用到Test()这个方法.  :)
      

  17.   


    嗯,是我搞错了,不好意思。不过我试了下用这个EditorBrowsable标签放到每个__Test()之上后,当我在C.Test()方法中输入"b."的时候,跳出来的智能感知的函数列表里还是可以看到__Test()这个方法。也有可能是我用错了,没调查 =_=|