比类更具可访问性的方法

时间:2011-05-18 10:42:20

标签: c# java

在密封类中使用比类本身更具可访问性的方法是否合理。 当然,不考虑以后的重构......

实施例

class SomeClass
{
    public void SomeMethod()
    {
        ...
    }
}

6 个答案:

答案 0 :(得分:1)

如果类实现了一个公共接口,那么可能有理由这样做。然后,工厂(与SomeClass在同一个包中)可以实例化该类并将其返回给用户(使用该接口)

编辑:我的回答是在Java如何工作的背景下。

答案 1 :(得分:1)

(我的答案仅适用于C#)

当然它很有用!

原因1:

访问修饰符不能全部按顺序排列。

您是否认为protectedinternal更容易访问,或者更少?

原因2:

覆盖bace类方法并实现接口:

internal sealed class MyClass
{
    public override string ToString()
    {
        return "How would you do this without public methods?";
    }
}

现在通过将MyClass强制转换为Object,该方法可以在集合之外公开。

实现IEnumerator时经常使用此模式。真正的班级通常是私人的(甚至不是内部的)。

原因3:

访问私有嵌套类:

public class A
{
    public string TellMeWhy()
    {
        return B.TheReason;
    }

    sealed private class B
    {
        internal static string TheReason = 
            "How would you access any of these members " +
            "if they all have to be private?";
    }
}

答案 2 :(得分:1)

这是实现工厂模式的一种相当常见的方式(我在这里从java的角度讲,但我猜c#也是如此)

为公共类提供一个公共工厂方法,返回实现公共接口的对象实例。

提供工厂返回的公共接口的非公共实现。

客户端可以通过调用工厂的methid来获取接口的实例,但不能直接实例化它们(使用new运算符)

所以,是的 - 这是合理的事情。

答案 3 :(得分:0)

有什么用?如果您无法访问该类,您将如何访问这些方法?

不知道静态类是否有意义,但我对此表示怀疑。

答案 4 :(得分:0)

我会说'不',主要是基于KISS-不为你不需要的东西编码。如果在程序集外部不需要该方法,则将其设置为内部。

答案 5 :(得分:0)

要实例化内部类,必须首先实例化外部类。然后,在外部对象中创建内部对象。

所以,它看起来不太合理。