C#方法重写指南:如何将Search改为虚方法重写并保持原有搜索逻辑
实现方案
你需要先把原有静态Search方法改为实例级别的虚方法(静态方法无法标记为virtual),再在两个派生类中重写即可,修改后逻辑和原有功能完全一致,具体实现如下:
using System; using System.Collections.Generic; namespace _3._1 { class Program { static void Main(){ List<Message> messages = new List<Message>(); messages.Add(new SmsMessage {text = "Hello!"}); messages.Add(new SmsMessage {text = "What?"}); messages.Add(new SmsMessage {text = "You?"}); messages.Add(new EmailMessage {text = "Show"}); messages.Add(new EmailMessage {text = "You!"}); messages.Add(new EmailMessage {text = "Hello!"}); string query = Console.ReadLine(); int i = 0; foreach(Message str in messages){ // 改为调用实例的Search方法 if(str.Search(query)){ i++; } } Console.WriteLine($"query: {query} | coincidences: {i}"); } } class Message { public string text { get; set; } // 改为实例虚方法,去掉static修饰符,添加virtual标记 public virtual bool Search(string query){ return text.Contains(query); } } class SmsMessage : Message { public string phone; // 重写虚方法,逻辑和基类保持一致 public override bool Search(string query){ return text.Contains(query); } } class EmailMessage : Message { public string email; public string subject; // 重写虚方法,逻辑和基类保持一致 public override bool Search(string query){ return text.Contains(query); } } }
核心修改说明
- 移除了
Search方法的static修饰符,添加virtual关键字,方法逻辑改为直接访问当前实例的text属性进行匹配,不需要再额外传入Message实例参数 - 在
SmsMessage和EmailMessage类中添加override修饰的Search方法,匹配逻辑和基类完全一致,保证搜索结果和修改前没有差异 - 调整了Main方法中的调用方式,从静态类调用改为实例方法调用
内容的提问来源于stack exchange,提问作者Thrackerzod
相关产品推荐
相关产品推荐

