C # Наследование и методы - PullRequest
0 голосов
/ 28 января 2019

Я изучаю наследование и понимаю код ниже.

namespace InheritanceApplication {
   class Shape {
      public void setWidth(int w) {
         width = w;
      }
      public void setHeight(int h) {
         height = h;
      }
      protected int width;
      protected int height;
   }

   // Base class PaintCost
   public interface PaintCost {
      int getCost(int area);
   }

   // Derived class
   class Rectangle : Shape, PaintCost {
      public int getArea() {
         return (width * height);
      }
      public int getCost(int area) {
         return area * 70;
      }
   }
   class RectangleTester {
      static void Main(string[] args) {
         Rectangle Rect = new Rectangle();
         int area;

         Rect.setWidth(5);
         Rect.setHeight(7);
         area = Rect.getArea();

         // Print the area of the object.
         Console.WriteLine("Total area: {0}",  Rect.getArea());
         Console.WriteLine("Total paint cost: ${0}" , Rect.getCost(area));
         Console.ReadKey();
      }
   }
}

Однако, почему они создали функции установленной высоты и ширины.Не лучше ли просто сделать это просто:

public int width {get;set;}
public int height {get;set;}

, а затем в основном классе сделать что-то вроде ниже:

rect.width = 5;
rect.height = 7;

Большое спасибо,

Amir

1 Ответ

0 голосов
/ 28 января 2019

Я уверен, что другие будут давать разные очки, но вот мои главные 2 причины использования get / sets.Если они не применяются для данного свойства, скорее всего, я не буду использовать методы получения / установки.

1 - Отладка Это значительно облегчает отладку распространения данных (как данные передаются), если вы можете отлаживать сеттер, который вас беспокоит.Вы можете легко добавить вызов Debug.Print и отладить установленное значение, если вас беспокоит, что ему передано неправильное значение.Или вы можете установить точки останова и отладить трассировку стека.Например:

   class Shape {
       public void setWidth(int w) {
           if(w < 0)
               Debug.Print("width is less than 0!");

           width = w;
       }
       public void setHeight(int h) {
           height = h;
       }
       protected int width;
       protected int height;
    }

2 - действия по изменению значения Возможно, есть лучшие способы добиться этого, но мне нравится иметь возможность добавлять простую логику к сеттерам, чтобы гарантировать, что любая логика, которая должна работать при изменении значения, делает это.Например, я могу использовать следующее:

public void SetWindowHeight(int newHeight)
{
    if(WindowHeight == newHeight)
        return;

    WindowHeight = newHeight;

    UpdateWindowDisplay();
}
public int GetWindowHeight()
{
    return WindowHeight;
}

private int WindowHeight;


public void UpdateWindowDisplay()
{
    Window.UpdateHeight(WindowHeight);
    // Other window display logic
}

Хотя лично я предпочитаю использовать свойство get / sets, но это только мои предпочтения.

public int WindowHeight
{
    get
    {
        return windowHeight;
    }
    set
    {
        if(windowHeight == value)
            return;

        windowHeight = value;

        UpdateWindowDisplay();
    }
}
private int windowHeight;

public void UpdateWindowDisplay()
{
    Window.UpdateHeight(WindowHeight);
    // Other window display logic
}
...