【问题标题】:Why does this class instantiate its own object within the class itself? [closed]为什么这个类在类本身内实例化它自己的对象? [关闭]
【发布时间】:2013-02-15 11:58:06
【问题描述】:

关于接口,我遇到了以下代码示例。为什么这个类在 main 方法中实例化自己的对象?它是 C# 和 Java 中的有效理论或代码约定吗? (编译器没有抱怨..但我很好奇)

using System;

interface IParentInterface
{
    void ParentInterfaceMethod();
}

interface IMyInterface : IParentInterface
{
    void MethodToImplement();
}

class InterfaceImplementer : IMyInterface
{
    static void Main()
    {
        InterfaceImplementer iImp = new InterfaceImplementer();
        iImp.MethodToImplement();
        iImp.ParentInterfaceMethod();
    }

    public void MethodToImplement()
    {
        Console.WriteLine("MethodToImplement() called.");
    }

    public void ParentInterfaceMethod()
    {
        Console.WriteLine("ParentInterfaceMethod() called.");
    }
}  

【问题讨论】:

  • 为什么你认为它不应该这样做?它在 C# 和 Java 中都完全有效。
  • 但是将 main 方法放在实现接口的类中确实看起来很奇怪。就个人而言,我不会那样做。
  • @Jon Skeet 说它完全有效——是的,编译器没有抱怨。 Daniel Hilgarth 说这看起来很奇怪(更不用说我的感觉了)。你们中的任何一个可以指导我参考代码示例参考或一篇文章来阅读/体验:“将 main 方法放在实现接口的类中看起来很奇怪”

标签: c# class interface instantiation


【解决方案1】:

“main”方法是静态的,因此它不引用任何 InterfaceImplementer 实例。要调用实例方法,它需要创建一个实例。

据我所知,称为“main”的静态方法不是任何已知的约定。

如果这是尝试使用单例,则应该将 main 方法替换为静态构造函数并由私有 InterfaceImplementer 变量支持

将调用两个方法的方法命名为“Main”似乎不是一个好的名称选择。

编辑回答 cmets

为了完全理解单例模式,我强烈建议阅读this

名为“Main”的方法不能帮助调用者理解该方法正在做什么。我会选择“运行”、“初始化”、“调用”。

【讨论】:

  • 谢谢。这是什么意思:“据我所知,称为'main' 的静态方法不是任何已知的约定。”?单例尝试是什么意思?我在这里所理解的,作者试图展示如何从多个接口和描述接口的父类中实现。您能否为此显示一个示例代码:“如果这是尝试使用单例,则 main 方法应替换为静态构造函数并由私有 InterfaceImplementer 变量支持”?我是一名初学者,试图通过编码来了解这些理论。
  • @Luis: 它将被称为 main 所以它是程序的入口点
  • 我找到了this to be helpful in terms of instantiating an object within own class.。但我不太相信这里涉及接口。我假设这些接口的行为与任何其他接口或类一样,具有没有实现的方法。
  • 没有实现的类方法 ==> 抽象类 当你从一个类继承时,你会损害自己的继承链:所有属性、方法和事件。一个类从不继承它而是声称要实现它的接口。它几乎就像从一个抽象类继承,但您不仅限于一个“父级”,而且您也不受该父级的约束,因此您可以让不同的类实现相同的接口,而不是在同一个继承链中跨度>
【解决方案2】:

这可能来自教程。

代码是作为控制台应用程序运行的,它必须有一个静态的Main 方法,这是程序执行开始的地方。

因此,当您使用该类运行程序时,它将测试 2 种方法。
该类在 main 方法中创建其自身的实例,因为它自身不是静态类。

如果有一个单独的 program 类和通常情况下的 static main 方法,那就不会那么混乱了。

【讨论】:

  • 是的,它来自网上的教程。我认为作者更多地强调了如何在继承它们的子类中实现接口。所以也许他采取了one-class-experiment的方法。我发现这篇文章可以进一步阅读。
猜你喜欢
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
相关资源
最近更新 更多