如何在类外隐藏方法

3

我想做一些事情,但我不知道是否可能。 我有这些类:

public Class1
{
    private Class2 class2;

    public Class1
    {
        this.class2 = new Class2();
    }

    public Class2 Do()
    {
        return class2.Build();
    }
}

internal Class2
{
    public internal Class2 Build()
    {
        return this;
    }

    public void Fill()
    {
    }
}

var class1 = new Class1();
class1.Do().Fill();

我希望用户在键入class1.Do()时,只能访问Fill()方法。我该怎么做?

目标是防止class1.Do().Build();的调用。


那么目标是防止 class1.Do().Build(); 吗? - Broots Waymb
@BrootsWaymb 是的!目标达成了! - StackPHPcRoW
3
你想要的是一种“流畅接口”。请研究此主题。 - Robert Harvey
9
最好的方法是创建一个接口,公开“Fill()”并在Class2中实现它。在Class1中,“Do()”方法的返回类型应该是该接口。 - Arcord
2
这是你实际的代码吗?你多次缺少 class 关键字,而且不能像那样同时使用 public internal 修饰符。此外,Class1 构造函数缺少括号。还有一个关于 Do() 的可访问性问题... - Code Stranger
1个回答

4

如评论中提到的那样,所发布的代码中有相当多的错误。为了提供一个示例答案,我将所有麻烦的地方都公开了。因此,尽管这段代码可以编译通过,请带着一颗谨慎的心态,并根据需要调整访问修饰符。

首先,我创建了一个新接口,只公开了Fill而不是Build:

public interface IClass2Helper
{
    void Fill();
}

我对 Class1Class2 进行了几个小改动,使它们能编译通过,并在 Class2 中实现了接口,在 Class1Do() 方法中返回了该接口:

public class Class1
{
    private Class2 class2;

    public Class1()
    {
        this.class2 = new Class2();
    }

    public IClass2Helper Do()
    {
        return class2.Build();
    }
}

public class Class2 : IClass2Helper
{
    public Class2 Build()
    {
        return this;
    }

    public void Fill() { }
}  

并添加了一个简单的测试类/方法来进行验证:

class TestProgram
{
    static void Main()
    {
        var class1 = new Class1();
        class1.Do().Fill(); //This line is OK

        //The below line will have an error since the interface doesn't expose a Build method
        class1.Do().Build(); 
    }
}  

代码小调试:
https://dotnetfiddle.net/5EPPfO


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接