none
vb.net或者c#.net中,派生类如何删除基类成员? RRS feed

  • 问题

  • 这里故意说的删除,而不是隐藏,因为区别于一般的隐藏、覆盖等。
    比如有一个基类,有一个函数:
    sub 花色

    在一些派生类中,要用花色;但也有一些派生类,希望不要出现花色这个过程,也不需要其他的花色过程来覆盖。当生成示例时,成员中要求压根就不要有花色这个东东。

    这里暂不探讨"为什么要这么用呢?"之类的话题。只谈能否实现、如何实现。谢谢!

    我需要的是vb.net的答案,如果你只会c#.net,也可以,我看看vb.net中有没有类似的解决方案。谢谢!

    2014年3月23日 1:28

答案

  • Hi, 语法上无法实现,但可以变通一下,比如说,可以禁止在派生中调用基类的函数(通不过编译),例子如下:

    Public Class A
        Public Sub 花色()
        End Sub
    End Class
    
    Public Class B : Inherits A
        <Obsolete("deleted", True)>
        Public Shadows Sub 花色()
        End Sub
    End Class

    你可以测试一下以下代码,在调用“b.花色”时,编译器会报错

            Dim a = New A()
            a.花色()
            Dim b = New B()
            b.花色()

    2014年3月23日 12:47
  • 不能实现。

    2014年3月24日 1:28

全部回复

  • Hi, 语法上无法实现,但可以变通一下,比如说,可以禁止在派生中调用基类的函数(通不过编译),例子如下:

    Public Class A
        Public Sub 花色()
        End Sub
    End Class
    
    Public Class B : Inherits A
        <Obsolete("deleted", True)>
        Public Shadows Sub 花色()
        End Sub
    End Class

    你可以测试一下以下代码,在调用“b.花色”时,编译器会报错

            Dim a = New A()
            a.花色()
            Dim b = New B()
            b.花色()

    2014年3月23日 12:47
  • 不能实现。

    2014年3月24日 1:28
  • 当然可以了,实际上这是很常见的需求,我继承一个基类,但又不希望它的某些函数被暴露出来或者说被沿用,这时就要屏蔽它。近几年一直在用C++,所以VB的语法想不起来了,C#还行,所以只好用C#演示一下了,您凑合着看吧。

    public class X
    {
        public string A() { return "Class X"; }
    }
    class _Y : X
    {
        public string B() { return "Class Y"; }
    }
    public class Y
    {
        private _Y e = new _Y();
        public string B() { return e.B(); }
    }

    此时您再用 class Y 时就没有函数 A 了。也就是说方法是:public基类 -> private派生类 -> public类,用最终的这个类去包住那个private派生类,然后把需要公开的方法、函数都传出来。这么做确实比较麻烦,但有时不得不这么做,因为基类里的一些函数确实不适合暴露出来,如果只是隐藏它会让其他使用者困惑,这时就只好这样弄一下。当然,如果您不需要调用基类里的 protected 成员的话,可以跳过继承直接包那个基类。


    Shi Xin

    Picture是一款免费图片浏览器,完全支持触摸操作,赶快来下载吧。

    你这个确实是个办法。

    但是这个办法连隐藏都不算, 最终的Y 其实并不是任何类的派生类, 你只是挑出了需要的成员和它的方法,并将这个成员设置为private, 并不是通过派生类 去 删除 基类的成员来实现的, 所以你这个答案可以设置为answer 的前提是  你得说明这个不是通过删除实现的。

    不过  这个确实是个不错的办法  虽然有些麻烦。 :)


    remember make the reply as answer and vote the reply as helpful if it helps.


    • 已编辑 Risa- 2014年3月26日 2:19
    2014年3月26日 2:19
  • 纵观各位的说法,lapheal给出了权宜之法。在编程时还是能看到这些方法,不过会显著被标记并且编译无法通过。这是我目前听到的最好的办法了,尽管还不满意这种方法。

    给出了中规中矩的说法:不能。这是我在其他论坛里共同的结果。

    Shi Xin给出了更变通的方法,可惜c++我看不懂,有谁帮我翻译成vb就好了。

    2014年4月1日 7:19
  • 帮我把他的方法翻译成vb.net好吗?谢谢!
    2014年4月1日 7:25
  • 不怎么能看懂,你能翻译成vb.net吗?实在不行c#也行。我不知道你的这些在vb中如何实现。c#略知一二。谢谢您的非常认真的答复!
    2014年4月1日 7:26
  • Public Class X
    	Public Function A() As String
    		Return "Class X"
    	End Function
    End Class
    Class _Y
    	Inherits X
    	Public Function B() As String
    		Return "Class Y"
    	End Function
    End Class
    Public Class Y
    	Private e As New _Y()
    	Public Function B() As String
    		Return e.B()
    	End Function
    End Class
    http://converter.telerik.com/   转换…… 其实就是用其他的类来自主选择 private派生的子类 并在同样名字的方法里调用对应子类成员的同名的方法。

    remember make the reply as answer and vote the reply as helpful if it helps.

    2014年4月1日 7:30