怎么样隐藏基类方法

离子漂浮物 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时无法请求到隐藏的方法,类似显示实现接口的那种隐藏效果,不然每次都要标注某某方法作废...相当的麻烦呢。
...全文
191 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
谢谢楼上的各位帮忙,我把抽象类和接口的概念搞错,把接口的工作硬是交给抽象类来作了,现在理通了,也算是一个小进步,嘿嘿。
cat_hsfz 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个方法的类里隐藏(删除)掉多的那个方法。

当然,如果有更好的办法解决那更好了。不局限于我用的方法。
加载更多回复(8)

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧