2013-02-15 4 views
1

Что касается интерфейсов, я столкнулся с следующим примером кода. Почему этот класс создает экземпляр собственного объекта в основном методе? Является ли это допустимой теорией или условным обозначением кода в 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."); 
    } 
} 
+1

Почему вы думаете, что это не должно быть так? Он отлично подходит как для C#, так и для Java. –

+0

Но, конечно, странно ставить основной метод в класс, реализующий интерфейс. Лично я бы этого не сделал. –

+0

@ Джон Скит сказал, что это совершенно верно - да, компилятор не жаловался. Даниэль Хильгарт сказал, что это выглядит странно (тем более, что я чувствовал). Можете ли вы любезно направить меня на ссылку на образец кода или статью для чтения/экспериментирования на: * «выглядит странно, чтобы поместить основной метод в класс, который реализует интерфейс» *? – aspiring

ответ

2

Метод «main» является статическим, поэтому он не ссылается на экземпляр InterfaceImplementer. Для вызова методов экземпляра ему необходимо создать экземпляр.

Статический метод, называемый «основным», не является, насколько я знаю, любым известным соглашением.

Если это попытка иметь одноплодный основной метод должен быть заменен статическим конструктором и быть подкреплен частной InterfaceImplementer переменной

Чтобы назвать метод «Main», который будет вызывать два методы не кажется хороший выбор имени.

EDIT, чтобы ответить на комментарии

Чтобы полностью понять одноплодной шаблон я настоятельно советую при чтении this

метод, названный «Main» не поможет абоненту понять то, что метод делает. Я бы выбрал «Run», «Initialize», «Invoke».

+0

Спасибо. Что вы подразумеваете под этим: * «Статический метод, называемый« основным », не является, насколько я знаю, каким-либо известным соглашением». *? Что вы подразумеваете под одной попыткой? Все, что я понимаю здесь, автор пытается показать, как реализовать из нескольких интерфейсов и родительский класс, описывающий интерфейсы. Можете ли вы показать пример кода для этого: * «Если это попытка иметь одноэлементный режим, основной метод должен быть заменен статическим конструктором и подкреплен частной переменной InterfaceImplementer« *? Я новичок, пытающийся догнать эту теорию с помощью кодирования. – aspiring

+1

@Luis: Он будет называться main, так что это точка входа в программу –

+0

Я нашел [это полезно для создания экземпляра объекта внутри собственного класса.] (Http://stackoverflow.com/questions/5186214/ почему-может-вы-Instantiate-а-класс в-его-определения). Но я не очень-то убежден в том, что здесь присутствует интерфейс. Я предполагаю, что эти интерфейсы действуют как любые другие интерфейсы или классы с методами без реализации. – aspiring

1

Вероятно, это было из учебника.

Код должен был запускаться как консольное приложение, которое должно иметь статический метод Main, в котором начинается выполнение программы.

Итак, когда вы запускаете программу с этим классом, она проверит два метода.
Класс создает экземпляр своего «я» в основном методе, потому что это не статический класс.

Это было бы менее запутанным, если бы был отдельный класс program с методом static main, как это обычно бывает.

+0

Да, это из учебника, найденного в Интернете. Я предполагаю, что автор уделяет больше внимания тому, как реализовать интерфейсы в дочернем классе, который их наследует. Поэтому, возможно, он взял подход [одноклассный эксперимент] (http://stackoverflow.com/questions/5186214/why-can-you-instantiate-a-class-within-its-definition). Я нашел этот пост, чтобы читать дальше. – aspiring

Смежные вопросы