c# – 从派生类隐藏属性
发布时间:2020-12-15 17:50:10 所属栏目:百科 来源:网络整理
导读:Jon Skeet在他的视频中提到了这个问题 (虽然没有提供答案). 假设我们有一个名为Person的类 Person类具有Name属性 然后我们有另一个班,间谍. 当然,间谍是一个人,所以我们将从Person类派生. public class Person{ public string Name { get; set; }}public cla
Jon Skeet在他的视频中提到了这个问题
(虽然没有提供答案). 假设我们有一个名为Person的类 然后我们有另一个班,间谍. public class Person { public string Name { get; set; } } public class Spy : Person { } 我们不希望人们知道Spy的名字,所以我们希望这会给出一个编译错误: static void ReportSpy(Spy spy) { string name = spy.Name; } 或者: static void ReportSpy(Spy spy) { Person spyAsPerson = spy; string name = spyAsPerson.Name; } 我们怎么能防止这种事情发生呢? 解决方法
在基本Person类中使Name属性为virtual.在派生的Spy类中,覆盖该属性并在getter中抛出Exception.
public class Person { public virtual string Name { get; set; } } public class Spy : Person { public override string Name { get { throw new Exception("You never ask for a spy's name!"); } set { base.Name = value; } } } 但是,我建议不要抛出异常 get { return "**********"; } 因为,它打破了LSP(在另一个答案中提到).这意味着什么(只是一个例子),我总是可以这样做 Person x = new Spy(); 并将其传递给其他方法,可能就像 void RegisterForNextBallGame(Person p) { playerList.Add(p.Name); } 这种方法不知道体育场周围的一些间谍漫游,在做一个简单的诚实任务时崩溃! 编辑 为了说清楚,这个名字= **********仍然不是一个正确的解决方案.它只会从异常中拯救!之后,人们可能会发现许多人在名称为**********的代码中走下来,这将导致后来的惊喜和其他问题. 更好的解决方案是更好的设计.检查内森的答案以获得一些暗示. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |