Właściwości klasy a jej zmienne

0

Moja klasa wygląda tak:

 class Punkt
    {
        private int x;
        private const int MaxValueX = 99;

        public int X
        {
            get
            {
                return x;
            }
            set
            {
                if (value <= MaxValueX)
                    x = value;
            }
        } 

        public int Y { get; set; } = 1;

        public Punkt(int x, int y)
        {
            X = x;
            Y = y;
        }
}

Mam do niej dwa pytania:

  1. Czy jest jakiś sposób, abym sam sobie ograniczył dostęp bezpośrednio do zmiennej x wewnątrz klasy? Chodzi o to, że skoro mam właściwość X, która ma określony setter, to chciałbym NIE MÓC (w tym wypadku) bezpośrednio ustawiać wartości zmiennej x. Tymczasem w konstruktorze mogłem sobie spokojnie napisać this.x = x i w ten sposób pominął bym setter.
  2. Czy to w ogóle sensownie wygląda, jeśli w przypadku właściwości X używam zmiennej x, a w przypadku Y idę na skróty? Czy nie powinienem w tym wypadku zadeklarować zmiennej y dla uzyskania lepszej spójności?
0
  1. Zainteresuj się readonly;
  2. Y jest ok, bo niczego nie robisz w getterze lub setterze. Jeżeli "customizujesz" gettera lub settera no to logiczne, że trzeba to rozpisać, jak w przypadku X;
0
grzesiek51114 napisał(a):
  1. Zainteresuj się readonly;
  2. Y jest ok, bo niczego nie robisz w getterze lub setterze. Jeżeli "customizujesz" gettera lub settera no to logiczne, że trzeba to rozpisać, jak w przypadku X;

Readonly sprawi, że pole x będzie modyfikowane jedynie przez konstruktor klasy. A ja chciałbym, aby pole x było modyfikowane swobodnie, ale jedynie za pośrednictwem właściwości X, a nie bezpośrednio.

0

To nie da się tak. Musiałbyś użyć samej tylko własności np: public int X { get; private set; } Pole prywatne jest z definicji dostępne do edycji wewnątrz całej klasy, chyba, że jest readonly.

0
grzesiek51114 napisał(a):

To nie da się tak. Musiałbyś użyć samej tylko własności np: public int X { get; private set; } Pole prywatne jest z definicji dostępne do edycji wewnątrz całej klasy, chyba, że jest readonly.

Ok,dzięki.

0

Należy zadać sobie pytanie po co chcesz tak robić? Na zewnątrz wystawiłeś interfejs do ustawiania wartości w postaci settera dla użytkowników klasy ale czy naprawdę musisz również koniecznie pilnować tej zależności wewnątrz, będąc deweloperem? Przecież zawsze możesz wewnątrz klasy również zwyczajnie użyć tego publicznego settera.

Zawsze możesz jednak stworzyć własny typ danych, który za automatu zwaliduje poprawność:

using System;
using System.Linq;
using System.Collections.Generic;

namespace App
{
    public class RangedInteger
    {
        private int min = 0;
        private int max = 99;

        private int integerValue;
        public int IntegerValue
        {
            get => integerValue;
            set => integerValue = (value > min && value < max) ? value : min;
        }
    }

    public class Point
    {
        private RangedInteger x;
        private RangedInteger y;

        public int X { get => x.IntegerValue; }
        public int Y { get => y.IntegerValue; }

        public Point(int x, int y)
        {
            this.x = new RangedInteger { IntegerValue = x };
            this.y = new RangedInteger { IntegerValue = y };
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            var point = new Point(15, 199);
            Console.WriteLine($"X: {point.X}, Y: {point.Y}");
        }
    }
}
0

Dzięki za dodatkową podpowiedź. Czy mogę dziś po polsku poczytać o zapisach takich jak ten?

get => integerValue;

Co to za rodzaj przypisania?

1 użytkowników online, w tym zalogowanych: 0, gości: 1