C#新手提问,送分求解答!关于密封类问题

我学C# 测试下密封类的使用,写了如下代码,我并没有重写或继承Man这个类,为什么老提示我 “错误 1 因为“test.Man.Walk()”不是重写,所以无法将其密封 C:\Users\Administrator\Documents\Visual Studio 2008\Projects\test02\test02\Program.cs 20


using System;

namespace test
{
class Animal
{
public void Eat()
{
Console.WriteLine("Animal eating");
}
}

class Man : Animal
{
public new void Eat() //继承后重写 Eat 使用new
{
Console.WriteLine("Man eating");
}

public sealed void Walk() //封装Walk方法,继承后不能重写
{
Console.WriteLine("Man Walk !");
}
}



class Program
{
static void Main()
{
Man q = new Man();
q.Eat();
}
}
}


...全文
194 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
吹风的兔子 2012-03-01
  • 打赏
  • 举报
回复
1. 函数不加 virtual ,子类就不可改写这个函数!
2. 你使用 sealed 就是想说,这个函数封闭,子类不可改写!

你有没有发现,1, 2 有矛盾 : 一种功能需要两个语法支持!C#脑壳有问题?


任何子类,只要用 new 了,就可以不受限制,隐藏任何父类成员,不管父类是否允许改写!!!




欢乐的小猪 2012-02-28
  • 打赏
  • 举报
回复
密封方法必须是override的
蔡袅 2012-02-28
  • 打赏
  • 举报
回复
sealed在修饰方法时作用是中断继承链,但是将本身加入到继承链中。
而,new也是中断继承链,但是本身脱离与继承链的关系。
显然Walk没有在之前的父类或者更原始的层次上定义,不存在继承链的关系,用sealed肯定不通过。
  • 打赏
  • 举报
回复
密封方法 只能是重写 override 的方法,即 如果类中的一个 方法被 sealed 关键字修饰,必须在该类的基类(父类) 中有一个同名方法,且该方法 被 virtural 关键字 修饰。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 caozhy 的回复:]

(1)首先你根本就不理解什么是重写,new 一个方法根本就不是重写。而是隐藏,本质上和你随便写一个方法是一样的,加上new只是因为和父类重名而已。这个方法和继承的类没有任何关系。

简单来说,隐藏方法虽然在教科书上反复被提到,但是实际上初学者根本不可能用到。也就是说,让初学者比较什么virtual/override 和 new,还不如根本不告诉初学者有后者。这种教学简直误人子弟。

(2……
[/Quote]

++;

sealed 必须要被override(重写)的,就像和抽象类一样,必须被 override
zhanghw0212 2012-02-27
  • 打赏
  • 举报
回复
sealed 好像必须要和override一起使用的。
threenewbee 2012-02-27
  • 打赏
  • 举报
回复
(1)首先你根本就不理解什么是重写,new 一个方法根本就不是重写。而是隐藏,本质上和你随便写一个方法是一样的,加上new只是因为和父类重名而已。这个方法和继承的类没有任何关系。

简单来说,隐藏方法虽然在教科书上反复被提到,但是实际上初学者根本不可能用到。也就是说,让初学者比较什么virtual/override 和 new,还不如根本不告诉初学者有后者。这种教学简直误人子弟。

(2)密封方法必须是重写的,参考:
http://msdn.microsoft.com/zh-cn/library/aa645769(v=VS.71).aspx
threenewbee 2012-02-27
  • 打赏
  • 举报
回复
概念不清。。。

110,538

社区成员

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

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

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