如何在带有Main方法的类中使用公共接口及接口返回值
解决带Main方法的类中使用接口及返回接口实例的问题
咱们先梳理下你代码里的几个小问题,比如接口命名不统一(TestVal vs ITestVal、TestvalRes vs ITestValRes),这会导致编译错误,先把这些基础问题修正,再一步步实现需求。
第一步:统一并正确定义公共接口
按照C#的惯例,接口名称通常以I开头,咱们把两个接口的命名统一,同时补全属性的完整定义:
Program.cs 中的 ITestVal 接口
public interface ITestVal { // 输入参数属性 string Input { get; } // 验证方法,返回 ITestValRes 实例 ITestValRes ValidateRe(string input); }
TestValRes.cs 中的 ITestValRes 接口
public interface ITestValRes { string Input { get; } bool IsValid { get; } // 新增错误信息属性,方便返回验证细节 string ErrorMessage { get; } }
第二步:实现 ITestValRes 的具体类
接口不能直接实例化,咱们需要写一个具体类来实现ITestValRes,这样后续验证方法就能返回这个类的实例:
// 可以放在 TestValRes.cs 文件中 public class TestValResImpl : ITestValRes { public string Input { get; } public bool IsValid { get; } public string ErrorMessage { get; } // 构造函数,初始化验证结果的各项属性 public TestValResImpl(string input, bool isValid, string errorMessage = "") { Input = input; IsValid = isValid; ErrorMessage = errorMessage; } }
第三步:在带Main方法的类中实现 ITestVal
现在让MyClass正确实现ITestVal接口,同时在ValidateRe方法中返回TestValResImpl的实例(也就是ITestValRes的实现类):
// Program.cs 中的 MyClass class MyClass : ITestVal { // 实现 ITestVal 接口的 Input 属性 public string Input { get; private set; } static void Main(string[] args) { // 创建实现了 ITestVal 接口的 MyClass 实例 ITestVal instance = new MyClass(); instance.Run(); } public void Run() { string testInput = "test"; // 调用验证方法,得到 ITestValRes 类型的结果 ITestValRes result = ValidateRe(testInput); // 输出验证结果 Console.WriteLine($"输入内容:{result.Input}"); Console.WriteLine($"是否有效:{result.IsValid}"); if (!result.IsValid) { Console.WriteLine($"错误信息:{result.ErrorMessage}"); } } // 实现 ITestVal 接口的 ValidateRe 方法 public ITestValRes ValidateRe(string input) { // 这里可以替换成你的实际验证逻辑,比如简单的长度校验 if (string.IsNullOrEmpty(input)) { return new TestValResImpl(input, false, "输入不能为空"); } else if (input.Length < 3) { return new TestValResImpl(input, false, "输入长度不能小于3"); } else { return new TestValResImpl(input, true); } } }
关键要点解释
- 接口实现的正确性:实现接口时必须完全实现接口的所有成员(属性、方法),比如
MyClass必须实现ITestVal的Input属性和ValidateRe方法,否则会编译报错。 - 返回接口实例的方式:接口本身不能用
new关键字实例化,所以必须返回一个实现了该接口的具体类的实例,比如这里的TestValResImpl,因为它实现了ITestValRes,所以可以向上转型为ITestValRes返回。 - 面向接口编程:在
Main方法中,我们用ITestVal类型来引用MyClass实例,而不是直接用MyClass,这样后续如果有其他实现ITestVal的类,代码可以更灵活地替换,符合开闭原则。
内容的提问来源于stack exchange,提问作者Murbarron
相关产品推荐
相关产品推荐

