密封继承问题

冰风漫天 2008-03-05 05:22:53
class AAA
{
public virtual ddd(){}
}

class BBB:AAA
{
public sealed void ddd()
{
Console.WriteLine("bbb");
}
}

class CCC: BBB
{}

class program
{
static void main()
{
BBB bbb = new BBB();
bbb.ddd();

CCC ccc = new CCC();
ccc.ddd();
}
}

我在类BBB里将方法ddd密封了,为什么在它的继承类CCC的实例里可以访问到这个方法?
怎么只让父类的属性或方法可以访问,而子类的不能访问

...全文
141 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
arlang 2008-03-06
  • 打赏
  • 举报
回复

密封方法只是在派生类中不能再重写一遍(再实现一遍),并不意味着在派生类的实例中不能访问啊。
派生类是默认继承基类所有非私有方法的。

我猜 楼主是想在派生类中不继承基类中的方法。但是你基类中的方法又需要在外部访问对不对?
也就是说,你想通过这种方式能访问。
BBB bbb = new BBB();
bbb.ddd();
而派生类ccc中的ddd()又不能被访问到,
CCC ccc = new CCC();
ccc.ddd(); //你想让他不能防问

这样不太可能,能在外部访问的方法都是public的,而对于自己的派生类,你又想让它成为private,这是个
矛盾,不太可能。
冰风漫天 2008-03-06
  • 打赏
  • 举报
回复
我之所以不想继承BBB类的一些public属性和方法是为了减小CCC类的实例所占内存的大小,难道public属性和方法就没办法不继承吗?
whlyj20030719 2008-03-06
  • 打赏
  • 举报
回复
至于楼主想达到的那种功能```我也没见过```如果会了也告诉我一声啊```在此先谢过了```反正我知道的

sealed似乎是不可封杀方法的了```顶多限制它不可被重写而己``````````
whlyj20030719 2008-03-06
  • 打赏
  • 举报
回复
sealed 修饰符用于类的话表明此类不可继承; 用在方法的话,表示此方法在派生类中不可重写,例如:
class BBB:AAA 
{
public sealed override void ddd()
{
Console.WriteLine("bbb");
}
}

class CCC: BBB
{
public override void ddd()
{
Console.WriteLine("CCC");
}
}
将会报错```
冰风漫天 2008-03-05
  • 打赏
  • 举报
回复
是不能继承,但能访问,改成private就既不能继承也不能访问了
kamiff 2008-03-05
  • 打赏
  • 举报
回复
class AAA
{
public virtual ddd(){}
}

class BBB:AAA
{
public sealed void ddd()
{
Console.WriteLine("bbb");
}
}

class CCC: BBB
{}

class program
{
static void main()
{
BBB bbb = new BBB();
bbb.ddd();

CCC ccc = new CCC();
ccc.ddd();
}
}

我在类BBB里将方法ddd密封了,为什么在它的继承类CCC的实例里可以访问到这个方法?
怎么只让父类的属性或方法可以访问,而子类的不能访问
把class BBB改成
class BBB:AAA
{
private void ddd()或void ddd()
{
Console.WriteLine("bbb");
}
}
冰风漫天 2008-03-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Gao_TF 的回复:]
class BBB:AAA
{
public sealed void ddd()//改成private void ddd()
{
Console.WriteLine("bbb");
}
}
[/Quote]
如果是改成私有的,那就不用问的,我的要求是在类BBB的实例里能访问到ddd方法,而在BBB的子类的实例里无法访问到ddd方法,按MSDN的说法sealed应该可以实现这个功能,但我上面那段代码里它貌似没有,所以才想不明白
shinaterry 2008-03-05
  • 打赏
  • 举报
回复
public sealed => private
stning 2008-03-05
  • 打赏
  • 举报
回复
密封类不能用作基类。因此,它也不能是抽象类。密封类主要用于防止派生。由于密封类从不用作基类,所以有些运行时优化可以使对密封类成员的调用略快。

在对基类的虚成员进行重写的派生类上的类成员、方法、字段、属性或事件可以将该成员声明为密封成员。在用于以后的派生类时,这将取消成员的虚效果。方法是在类成员声明中将 sealed 关键字置于 override 关键字的前面。例如:

public class D : C
{
public sealed override void DoWork() { }
}

Gao_TF 2008-03-05
  • 打赏
  • 举报
回复
改成private override void ddd()
Gao_TF 2008-03-05
  • 打赏
  • 举报
回复
class BBB:AAA
{
public sealed void ddd()//改成private void ddd()
{
Console.WriteLine("bbb");
}
}
stning 2008-03-05
  • 打赏
  • 举报
回复
sealed 修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与 override一起使用。
楼主看看上面这段msdn的解释。应该能明白

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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