【问题标题】:How are Nested classes different between C# and JavaC# 和 Java 之间的嵌套类有何不同
【发布时间】:2022-01-09 12:44:29
【问题描述】:

在 Java 中,如果嵌套类未声明为静态,则无法在静态上下文中访问它。这意味着内部类的实例只能通过外部类的实例来创建。例如:

class Prac{
  class Inner{} 
  public static void main(){
    Inner myObj = new Prac().new Inner();
  }   
}

对于我的 Java 调整大脑来说,这是有道理的。如果内部类不是静态的,则需要实例化外部类的实例。然而,在 c# 中,我可以将 Inner 非静态声明为嵌套类,并直接从 Main 方法中的静态上下文实例化它。

我读到 c# 嵌套类类似于 c++ 而不是 java,但我不熟悉内部类如何以任何其他方式工作。 c# 中嵌套类的底层机制是什么?

【问题讨论】:

  • 你见过this吗?
  • 理解嵌套 C# 类的一种方式是在命名空间内声明类的另一种(更复杂)方式。从使用(嵌套)类的代码的角度来看,namespace Prac { public class Inner {} }public class Prac { public class Inner {} } 之间没有明显区别,因为这两次你都会使用new Prac.Inner()。因此,嵌套 C# 类唯一真正的特点是它们可以访问父类的类成员。
  • 还有可见性:嵌套类可以声明为privateprotected 或其他,这意味着只有包含类/派生类或程序集等可以访问它。我认为 C# 和 Java 都是如此。而在泛型方面,C# 嵌套类继承了外部的泛型类型
  • @GoodNightNerdPride 感谢您的参考。我检查了它,虽然有点困惑,但我知道它是如何工作的。在Java 中,将嵌套类指定为静态仅仅意味着这个内部类的实例可以从静态上下文中创建,即简单地通过其父类的类名。在 C# 中,将类设置为静态意味着它不能有任何对象实例。它只是保存静态数据。但是当它不是静态的时,这个嵌套类只是用来定义一些类的层次结构,但总是可以从包含的类内部静态实例化。如果我错了,请纠正我

标签: java c# class oop


【解决方案1】:

考虑到微软强烈建议avoid public nested classes。 嵌套类的核心思想是向所有人完全隐藏抽象的实现细节。考虑这个例子:

IUserService

public interface IUserService
{
    IEnumerable<string> GetAllUsernames();
}

MockUserServiceProvider

public static class MockUserServiceProvider
{
    // Public
    public static IUserService New() => new MockUserService();



    // Nested Private class
    private class MockUserService : IUserService
    {
        public IEnumerable<string> GetAllUsernames()
        {
            yield return "Bob";
            yield return "Mary";
        }
    }
}

Mock 提供者的目标是向公众提供 Mock 接口的实例,将提供者绑定到特定的类类型是没有意义的,实际上,理论上,该类型不应该根本存在。所以最好的办法(不使用一些 I.L. 魔法,例如 Moq 所做的)就是用私有嵌套类完全隐藏类定义,这样任何人都无法访问它。

【讨论】:

    猜你喜欢
    • 2015-05-22
    • 1970-01-01
    • 2015-11-08
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2017-05-03
    相关资源
    最近更新 更多