You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在带有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:34:03