• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

怎么样隐藏基类方法

离子漂浮物 2009-06-05 08:42:56

public abstract class myBase
{
public abstract void aa();
public abstract void ac();
public void a() { }
public void b() { }
}

public class myClass : myBase
{
public override void aa()
{
throw new Exception("The method or operation is not implemented.");
}

public override void ac()
{
throw new Exception("The method or operation is not implemented.");
}
}


以上代码里myClass应该有四个方法,aa(),ac(),a(),b();
这个时候,aa()和b()在myClass是无效的,怎么样隐藏这两个方法呢?
这里的隐藏不是指用new或是虚方法的override,而是要在new myClass时无法请求到隐藏的方法,类似显示实现接口的那种隐藏效果,不然每次都要标注某某方法作废...相当的麻烦呢。
...全文
103 点赞 收藏 29
写回复
29 条回复
hua51117678 2012年06月04日
把心得和体会 写出来呗,难道是不用的方法抛出异常,空方法体吗?
回复 点赞
bwangel 2009年06月07日
N个子类里就一个例外,就没有必要去为了这个例外去改基类了吧?

你可以把子类里实现不了的抛出异常的情况写在基类里如下:

public abstract class myBase
{
//子类如果不重写...
public virtual void aa()
{
throw new Exception("The method or operation is not implemented.");
}
...

public void a() { }
public void b() { }
}

这样只要子类不重写就会抛出异常,这样处理好点
回复 点赞
离子漂浮物 2009年06月07日
谢谢楼上的各位帮忙,我把抽象类和接口的概念搞错,把接口的工作硬是交给抽象类来作了,现在理通了,也算是一个小进步,嘿嘿。
回复 点赞
CatChen 2009年06月06日
跟显式实现接口一样“显式实现基类”?如果你能够提出一种合理的模式来解释为什么你需要这样做,可以去给Microsoft提个建议,否则没必要这样搞。

我认为集成是myClass is a myBase的关系,如果有一件事是myBase可以做的,但myClass不可以做,那么我觉得你应该思考一下你这样的继承设计是否有问题。你是不是其实只是希望myClass与myBase共享一些代码,但myClass is not a myBase。
回复 点赞
北京的雾霾天 2009年06月06日
EditorBrowsable的可选参数参考如下的枚举:

Always 该属性或方法在编辑器中始终是可浏览的。
Never 该属性或方法始终不能在编辑器中浏览。
Advanced 该属性或方法是只有高级用户才可以看到的功能。编辑器可以显示或隐藏这些属性。
回复 点赞
北京的雾霾天 2009年06月06日
试试这样做:
1:照常实现这两个方法
2:在实现的方法上添加如下的两个属性:
[EditorBrowsable(0)]
[Browsable(true)]
回复 点赞
maddemon 2009年06月06日
既然ab对myclass无效 myclass就不必继承
你要把抽象类的抽象部分拿出来设计为接口 只需要继承接口就行了。。。
当然我这么说只是针对你的这个示例, 你肯定也不是这样子的

如果情况复杂你应该考虑使用设计模式。 这种子类富于变化的 我想应该考虑下原型模式吧
回复 点赞
CloneCenter 2009年06月06日
子类继承父类,这个没有什么问题。
如果子类无法实现父类的一些方法,那么这个子类就是一个不合格的子类。
回复 点赞
CloneCenter 2009年06月06日
[Quote=引用 6 楼 oyiboy 的回复:]
引用 5 楼 ljhcy99 的回复:
这不是相当于删除了基类  方法吗?
子类永远应该比父类  内容更丰富啊。

你这个问题很有意思


没办法啊,N个子类里,偏偏有一个没有这个方法的..我又不能说在基类里把这个方法去掉,然后重复N次。只好在没有的那个类里标注上某某方法无效,感觉很不爽啊...
[/Quote]
你说的这个就是N个子类中没有那个方法的子类的问题了,应该要修改的是子类,而不是基类。
回复 点赞
光宇广贞 2009年06月06日
隐藏?呵呵。

把基类的方法设为 private,子类就看不到了,当然了,子类永远也看不到了,但问题是,你在abstract类里面设 private 方法的话,有什么用?倒是可以由其它的类成员方法来调用呵……

把基类的方法设为 protected,子类可以看得到,但外面访问不到……

不知道你想干什么。你的要求,似乎不太合理。
回复 点赞
离子漂浮物 2009年06月06日
[Quote=引用 5 楼 ljhcy99 的回复:]
这不是相当于删除了基类 方法吗?
子类永远应该比父类 内容更丰富啊。

你这个问题很有意思
[/Quote]

没办法啊,N个子类里,偏偏有一个没有这个方法的..我又不能说在基类里把这个方法去掉,然后重复N次。只好在没有的那个类里标注上某某方法无效,感觉很不爽啊...
回复 点赞
离子漂浮物 2009年06月06日
找了一个折中的办法,不知道有没有好的建议



interface IMyInterface
{
void a();
void b();
void c();
}
public abstract class myBase
{
protected void baseA() { }
public void b() { }
}

public class myHiddenClass : myBase, IMyInterface
{

#region IMyInterface 成员

void IMyInterface.a()//隐藏方法
{

}

#endregion
}

public class myClass : myBase, IMyInterface
{

#region IMyInterface 成员

public void a()
{
base.baseA();
}

#endregion
}
回复 点赞
离子漂浮物 2009年06月06日
[Quote=引用 18 楼 saisky 的回复:]
如果你只是想子类和基类共享一些方法的话
那用继承貌似就不怎么合适了
出于设计思路,基类就不应该做接口了
[/Quote]

用继承不合适,那用什么合适呢?
回复 点赞
离子漂浮物 2009年06月06日
[Quote=引用 19 楼 kangde 的回复:]
引用 14 楼 oyiboy 的回复:
引用 9 楼 CloneCenter 的回复:
子类继承父类,这个没有什么问题。
如果子类无法实现父类的一些方法,那么这个子类就是一个不合格的子类。


儿子少个胳膊不能说这个儿子就不合格啊。



这个比喻有意思, 现实世界跟代码世界还是不能完全映射的.
[/Quote]

这个比喻比较可以映射到接口上。只是继承不知道行不行。
回复 点赞
moshangmoxia 2009年06月06日
[Quote=引用 18 楼 saisky 的回复:]
如果你只是想子类和基类共享一些方法的话
那用继承貌似就不怎么合适了
出于设计思路,基类就不应该做接口了
[/Quote]


虚拟世界还是无法完全的模拟现实的社会,最多也就是个缩影。。
回复 点赞
kangde 2009年06月06日
[Quote=引用 14 楼 oyiboy 的回复:]
引用 9 楼 CloneCenter 的回复:
子类继承父类,这个没有什么问题。
如果子类无法实现父类的一些方法,那么这个子类就是一个不合格的子类。


儿子少个胳膊不能说这个儿子就不合格啊。
[/Quote]

这个比喻有意思, 现实世界跟代码世界还是不能完全映射的.

回复 点赞
saisky 2009年06月06日
如果你只是想子类和基类共享一些方法的话
那用继承貌似就不怎么合适了
出于设计思路,基类就不应该做接口了
回复 点赞
sforiz 2009年06月06日
[Quote=引用 4 楼 enihs 的回复:]
哥们,这个意见上微软主页上去质疑他们。
抽象类和接口的问题是c#本身可以去改进的地方之一,所以c#还是有潜力的
[/Quote]

UP
回复 点赞
li45214521 2009年06月06日
扩展方法应该可以吧
回复 点赞
离子漂浮物 2009年06月06日
实际情况是:有一批类,其实有N个方法是相同的,其实有一个方法只需要N-1个。

我现在的作法是作一个抽象类,把相同的N个方法放在一起,然后作为基类给这批类继承,所以需要在那个只有N-1个方法的类里隐藏(删除)掉多的那个方法。

当然,如果有更好的办法解决那更好了。不局限于我用的方法。
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告