如何让ScriptExecuter返回其派生类的方法返回值?
问题原因与解决方案
你当前输出false的核心原因是:你实例化的是基类ScriptExecuter的对象,调用ExecuteSQL时自然执行的是基类的默认实现。要获取派生类的返回值,必须让基类引用指向派生类的实例,或者直接实例化派生类,利用C#的多态特性。
方案1:直接实例化对应派生类
把Main方法里的基类实例替换成你需要的派生类实例即可,比如要执行SQL就实例化SQLExecuter:
public class Program { static void Main(string[] args) { // 替换为SQLExecuter实例 var scriptExecuter = new SQLExecuter(); var result = scriptExecuter.ExecuteSQL("SELECT * FROM Table1"); Console.WriteLine(result); // 输出true } }
如果需要执行C#编译,就实例化CSharpCompiler:
var scriptExecuter = new CSharpCompiler(); var result = scriptExecuter.CompileCSharp("你的C#代码"); Console.WriteLine(result); // 输出true
方案2:用工厂模式动态选择派生类
如果需要根据不同的脚本类型动态切换实现,可以写一个工厂类来创建对应的派生类实例,避免硬编码:
public static class ScriptExecuterFactory { public static ScriptExecuter CreateExecuter(string scriptType) { return scriptType.ToLower() switch { "sql" => new SQLExecuter(), "csharp" => new CSharpCompiler(), _ => new ScriptExecuter() }; } }
然后在Main方法中使用:
static void Main(string[] args) { var scriptExecuter = ScriptExecuterFactory.CreateExecuter("sql"); var result = scriptExecuter.ExecuteSQL("SELECT * FROM Table1"); Console.WriteLine(result); // 输出true }
补充说明
C#的多态特性要求:基类引用必须指向派生类对象,才能调用到派生类中重写的虚方法。你之前的代码只是创建了基类对象,所以无法触发派生类的实现。
内容的提问来源于stack exchange,提问作者Green
相关产品推荐
相关产品推荐

