Ответы пользователя по тегу ООП
  • Почему не стоит вызывать методы в конструкторе?

    @smozhaykin
    На самом деле вызывать не стоит только виртуальные методы. Т.к. если класс наследник его переопределит, то возникнет ситуация, когда метод работает до вызова конструктора класса-наследника. И если в этом методе используются какие-нибудь поля класса-наследника, они могут быть еще непроинициализированы.

    А так как в Java

    In Java, all non-static methods are by default "virtual functions." Only methods marked with the keyword final, which cannot be overridden, along with private methods, which are not inherited, are non-virtual.


    то в конструкторе не стоит вызывать любые публичные не final методы.

    Ниже C# код (т.к. работаю в основном с этим языком), иллюстрирующий это.

    void Main()
    {
    	new B("name");
    }
    
    class A
    {
        public A()
    	{
    	     Method();
    	}
    	
    	protected virtual void Method()
    	{
    	}
    }
    
    class B : A
    {
        private string Property { get; set; }
    	
    	public B(string value)
    	{
    	    Property = value;
    	}
    	
        protected override void Method()
    	{
    	    Console.WriteLine(Property.Length);
    	}
    }


    Результат: Object reference not set to an instance of an object.

    StackTrace
    at UserQuery.B.Method()
    at UserQuery.A..ctor()
    at UserQuery.B..ctor(String value)
    at UserQuery.Main()
    Ответ написан
    Комментировать
  • Как организовать код через ООП для простой задачи?

    @smozhaykin
    Ну как минимум можно добавить такую иерархию: базовый класс Cell с виртуальным методом Open, от него наследуются классы MineCell и EmptyCell. Метод MineCell.Open завершает игру, EmptyCell.Open открывает ячейку и показывает число мин вокруг.
    Ответ написан
    1 комментарий