Dziedziczenie właściwości.

Dziedziczenie właściwości.
NU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:8
0

Mam pytanie, mam bazową klasę Rectangle i chcę z niej dziedziczyć klasę Squere. Chciałem, żeby klasa Squere miała jedną właściwość np. Side, zamiast dwóch, ale wtedy bym musiał jakoś przysłonić właściwości z klasy bazowej i nie do końca wiem jak to zrobić. Rozwiązałem to w poniższy sposób, ale wydaje mi się to średnim rozwiązaniem. W C++ bym próbował coś z = delete, ale nie mogłem znaleźć czegoś analogicznego w C#. W jaki sposób najładniej to rozwiązać?

Kopiuj

class Rectangle
    {
        public virtual double Height { get; set; }
        public virtual double Width { get; set; }
        
        public Rectangle(double height, double width)
        {
            Height = height;
            Width = width;
        }
  }

sealed class Squere : Rectangle
    {
        public override double Height { get { return base.Height; } set { base.Height = value; base.Width = value; } }
        public override double Width { get { return base.Width; } set { base.Height = value; base.Width = value; } }

        public Squere(double side) : base(side, side) { }
    }
Zobacz pozostałe 8 komentarzy
GironX
Nie tylko, przede wszystkim. Z uczelni , na Wyspach. Nie chodzi tu o stwierdzenie, że tylko się mówi w tym języku, chodzi o klasyfikację języków w ogóle.
YA
Kiedyś anglosasom wystarczyło, że pisali w taki sposób, że dało się wydedukować znaczenie wyrazu. Dopiero później podejmowano próby "standaryzacji". https://pl.wikipedia.org/wiki/Ortografia_angielska - color vs colour, da się wydumać znaczenie niezależnie czy jest się Amerykaninem, Brytyjczykiem czy Hindusem ;P
GironX
@Patryk27: skware :D Ciekawy jestem jak odczytasz "ghoti".
GironX
No to wygląda na to że Ty masz rację rację a ja się mylę. Bije pokłony aż do ziemi! :)
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
3

Tak się nie robi, tak dziedziczenie nie działa.

Poczytaj o zasadzie podstawienia Liskov (np. https://www.tomdalling.com/blog/software-design/solid-class-design-the-liskov-substitution-principle/).


ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:5 miesięcy
  • Postów:273
ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:5 miesięcy
  • Postów:273
0

Te dwie linijki tekstu są nie potrzebne . Wystarczy tak :

Kopiuj
    class Program
    {
        static void Main(string[] args)
        {
            Squere sq = new Squere(10);
            Console.WriteLine(sq.Height);
            Console.WriteLine(sq.Width);
        }
    }


    class Rectangle
    {
        public  double Height { get; set; }
        public double Width { get; set; }

        public Rectangle(double height, double width)
        {
            Height = height;
            Width = width;
        }
    }

    sealed class Squere : Rectangle
    { 
        public Squere(double side) : base(side, side) { }
    }
}

Klasa kwadrat nie powinna dziedziczyć po klasie prostokąt. Zły projekt .

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

@Zimny Krawiec: no tak średnio bym powiedział

Kopiuj
Squere sq = new Squere(10);
sq.Width = 25;
sq.Height = 100;
 
Console.WriteLine(sq.Width);
Console.WriteLine(sq.Height);

edytowany 1x, ostatnio: Patryk27
ZK
Pisałem, że ten cały projekt jest do ..... . n
GironX
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:59
0

Klasa kwadrat nie powinna dziedziczyć po klasie prostokąt. Zły projekt .

np

Kopiuj
class Rectangle()
{
    public Rectangle(double side)
    {
         Height = Width = side;
    }
}

Obawiam się, że może. Tworzysz przeciążony konstruktor, który pobiera jeden argument. Nie ma znaczenia czy przypiszesz do wysokości lub szerokości bo są takie same.Właściwie powinieneś przypisać do obu.

edytowany 3x, ostatnio: GironX
GironX
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:59
0

Nie wiem, czy autor wciąż jest zainteresowany wątkiem, ale dziedziczenie prostokąt - kwadrat moim zdaniem powinno wyglądać tak:

Kopiuj
class Rectangle
    {
        double _width;
        double _heigh;

        public Rectangle(double height, double width)
        {
            _width = width;
            _heigh = height;
        }


        public double AreaSize(double height, double width)
        {
            return height * width;
        }
        public double PerimeterLenght(double height, double width)
        {
            return 2 * (height + width);
        }
        

        public double Widht
        {
            get
            { return _width; }
            set
            {
                if (_width >= 0)
                {
                    _width = value;
                }
            }
        }
        public double Height 
        {
            get
            { return _heigh; }
            set
            {
                if (_heigh >= 0)
                {
                    _heigh = value;
                }
            }
        }

    }

class Square : Rectangle
    {
        public Square(double height, double width) : base(height, width)
        {
            _width = height;
            _heigh = height;
        }
        readonly double _width;
        readonly double _heigh;
    }

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

kwadrat moim zdaniem powinno wyglądać tak:

Oj chyba nie.

Kopiuj
public double AreaSize(double height, double width)
public double PerimeterLenght(double height, double width)

Dlaczego nie korzystasz z pól prywatnych, które zostały zainicjalizowane przez konstruktor?
Po co przekazujesz przez argumenty dane, które wsadzasz tak naprawdę konstruktorem klasy?
Poza tym to także powinny być raczej własności, no bo po co z tego robić metody?

edytowany 3x, ostatnio: grzesiek51114
GironX
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:59
0

Dotykasz odwiecznego sporu, metoda czy własność. :)
A tak naprawdę, bo one są wykorzystywane w specyficzny sposób w klasie GetData().

https://github.com/igorzeler/Training/tree/master/4P-rectangle/4P-rectangle

edytowany 1x, ostatnio: GironX
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

No ale przecież takie rzeczy można włożyć do abstrakta jako metody/własności wirtualne.

A tak naprawdę, bo one są wykorzystywane w specyficzny sposób w klasie GetData().

W jakiej klasie GetData()? To jest przecież bez sensu, bo powielasz dane, do których masz dostęp od początku istnienia obiektu.

EDIT: patrzyłem na tego Gita i przecież te metody nie są w ogóle w tej klasie wykorzystywane. Miast tego korzystasz z konstruktora więc... podejrzewam, że nie bardzo wiesz co robisz. ;)

Kopiuj
    class GetData
    {
        public Rectangle RectangleGetData()
        {
            Console.WriteLine("Podaj wysokość");
            double height = double.Parse(Console.ReadLine());
            Console.WriteLine("Podaj szerokosć");
            double widht = double.Parse(Console.ReadLine());
            var rec = new Rectangle(height, widht);
            return rec;
        }

        public Square SquareGetData()
        {
            Console.WriteLine("Podaj długość boku");
            double height = double.Parse(Console.ReadLine());
            double width = height;
            var squ = new Square(height, width);
            return squ;
        }
    }
edytowany 1x, ostatnio: grzesiek51114
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
1

Zrobię w nowym poście, bo w sumie chodzi już o konkretne rozwiązanie:

Nie lepiej tak?

Kopiuj
    abstract class Square // rzecz jasna chodzi o nazwę Shape ;)
    {
        public double Width { get; }
        public double Height { get; }

        public virtual double AreaSize { get; }
        public virtual double PerimeterLenght { get; }

        public Square(double width, double height)
        {
            Width = width;
            Height = height;
        }
    }

    class Rectangle : Square
    {
        public override double AreaSize => Height * Width;
        public override double PerimeterLenght => 2.0 * (Height + Width);

        public Rectangle(double width, double height)
            : base(width, height)
        {

        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Square rect = new Rectangle(4.0, 2.5);
            Console.WriteLine($"AreaSize: {rect.AreaSize}, PerimeterLenght: {rect.PerimeterLenght}");
        }
    }

EDIT: pomyliłem Square z Shape ale to i tak nie oznacza, że rozwiązanie podane przez OP jest prawidłowe ;)

edytowany 3x, ostatnio: grzesiek51114
Zobacz pozostały 1 komentarz
grzesiek51114
grzesiek51114
przeczytaj edita ;) 10tyś plusów się zbliża, jestem w stresie ;)
grzesiek51114
grzesiek51114
@kzkzg: nom, wiesz... doczekać się nie moge ;)
kzkzg
A dam Ci jednego, po starej znajomości, będziesz bliżej :D
grzesiek51114
grzesiek51114
@kzkzg: no, jak cudownie być zrozumianym ;) dzięki.
ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:5 miesięcy
  • Postów:273
0

Zrób abstrakcyjną klasę figura albo wielokąt

ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:5 miesięcy
  • Postów:273
0

Dam ci lepszy pomysł na naukę ze strony microsoftu

Tutaj jest mądry przykład:
https://docs.microsoft.com/pl-pl/dotnet/csharp/programming-guide/classes-and-structs/inheritance

edytowany 1x, ostatnio: aurel
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

A jeszcze lepiej zrobić ze Square interfejs.

ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:5 miesięcy
  • Postów:273
0

Ja bym sobie już dał spokój z tymi figurami geometrycznymi

GironX
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:59
0

Masz, rację, była błąd zapisu tych samych właściwości w dwóch klasach i to mi powodowało błąd, w ten sposób co zrobiłem udało mi się go obejść. Rozumiem , że chodzi Tobie o to:

Kopiuj

class Rectangle
    {
        public Rectangle(double height, double width)
        {
            Width = width;
            Height = height;
        }
        public double AreaSize(double height, double width)
        {
            return height * width;
        }
        public double PerimeterLenght(double height, double width)
        {
            return 2 * (height + width);
        }
        public double Width { get;  private set; }
        public double Height { get; private set; }
    }
edytowany 1x, ostatnio: GironX
grzesiek51114
grzesiek51114
Napisałem w postach wyżej o co mi chodzi.
GironX
Ale zadanie mówi o dziedziczeniu z prostokąta, Ty odwróciłeś i dziedziczysz prostokąt z kwadratu.
grzesiek51114
grzesiek51114
Faktycznie Square przeczytałem jako Shape ;) Jednakże to niczego nie zmienia i Twój kod i tak jest bez sensu. ;)
ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:5 miesięcy
  • Postów:273
0

Problem nie jest w tym jak to przełożyć mądrze na c# tylko z samym modelem klas . Bardziej zadanie dla matematyka niż programisty

ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:5 miesięcy
  • Postów:273
1

Pisałem prywatnie i na forum że klasa Kwadrat nie jest w ogóle potrzebna . Jedna klasa Prostokąt wystarczy do obliczania obwodu i pola

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Rozumiem, że kwadrat jest prostokątem ale tutaj w ogóle nie potrzebujesz dziedziczenia. ;) Kwadrat i prostokąt to specjalizacje, a nie abstrakty. Jeśli chcesz już koniecznie po czymś dziedziczyć to niech to będzie interfejs IShape.

Tak naprawdę Kwadrat i Prostokat powinny być sealed.

edytowany 1x, ostatnio: grzesiek51114
ZK
Wojtek wklej cały projekt od A do Z i wtedy będziemy dyskutować
grzesiek51114
grzesiek51114
Jaki Wojtek? O.o
ZK
grzesiek51114
grzesiek51114
Już myslałem, że było coś pite ;)
ZK
ślepnę od komputera
ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:5 miesięcy
  • Postów:273
0

Klasę Prostokąt możemy wykorzystać do obliczania pola kwadratu i obwodu w innej klasie . Dziedziczenie nie jest potrzebne tak jak piszesz

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Myślałem o czymś takim:

Kopiuj
    interface IShape
    {
        double Field { get; }
    }

    sealed class Rectangle : IShape
    {
        private readonly double width;
        private readonly double height;

        public double Field => width * height;

        public Rectangle(double width, double height)
        {
            this.width = width;
            this.height = height;
        }
    }

    sealed class Square : IShape
    {
        private readonly double side;

        public double Field => side * side;

        public Square(double side)
        {
            this.side = side;
        }
    }

Po prostu kwadrat i prostokąt to końcowe specjalizacje.

edytowany 1x, ostatnio: grzesiek51114
Zobacz pozostałe 8 komentarzy
GironX
@grzesiek51114 masz rację i nawet nie zamierzam udawać, że tak nie jest. :)
ZK
Pisałem , że jestem za tym żeby w ogóle nie było klasy kwadrat.
GironX
A założenia zadania czytałeś?
ZK
Dajmy sobie spokój z tym zadaniem bo niestrawności dostanę
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
1

Grzesiek, ja to wiem. Popatrz na post pierwszy w temacie.

Hehe, a dobra. To powinno być proste do osiągnięcia np. w ten sposób:

Kopiuj
    class Rectangle
    {
        public virtual double Width { get; }
        public virtual double Height { get; }
    }

    class Square : Rectangle
    {
        public virtual double Side { get; }
        public override double Height => Side;
        public override double Width => Side;
    }
GironX
grzesiek, przyznam się uczciwie, że nie wszystko wiem i taka konstrukcję pierwszy raz widzę na oczy, dla mnie to trochę jak delegat wygląda.
grzesiek51114
grzesiek51114
to jest własność tylko zapisana krócej. To tak jakbyś napisał public override double Height { get => Side; }
ZK
public int Wlasciwosc1 { get => pole * pole; set => pole = value; } public int Wlasciwosc2 => pole * pole; // jesli jest samo get to można zapisać na 2 sposoby public int Wlasciwosc3 { get => pole * pole; } public int Metoda1() => pole * pole;
BU
  • Rejestracja:około 10 lat
  • Ostatnio:14 dni
  • Postów:422
0

@grzesiek51114: jeśli zakładasz, że długości boków są tylko do odczytu, to Twoje rozwiązanie ma sens i jest zgodne z interpretacją figur w matematyce.

Ja mam takie rozwiązanie, że kwadrat wykorzystuje podobieństwo do prostokąta, ale nim nie jest. Mógłby istnieć interfejs I3DFigure, który rozszerza interfejs I2DFigure o właściwość Volume. Wtedy prostopadłościan (Cuboid) mógłby zawierać prywatną właściwość typu Rectangle jako podstawa i definiować dodatkową właściwość Depth lub trzy właściwości typu Rectangle - po jednej dla trzech różnych ścian, a sześcian (Cube) mógłby zawierać prywatną właściwość typu Cuboid.

Kopiuj
public interface I2DFigure
{
    double Area { get; }
    double Perimeter { get; }
}

public class Rectangle : I2DFigure
{
    public double Width { get; set; }
    public double Height { get; set; }
    public double Area => Width * Height;
    public double Perimeter => 2 * Width + 2 * Height;

    public Rectangle(double width, double height)
    {
        Width = width;
        Height = height;
    }
}

public class Square : I2DFigure
{
    public double Width
    {
        get
        {
            return Rectangle.Width;
        }
        set
        {
            Rectangle = new Rectangle(value, value);
        }
    }
    public double Area => Rectangle.Area;
    public double Perimeter => Rectangle.Perimeter;

    public Square(double width)
    {
        Rectangle = new Rectangle(width, width);
    }

    private Rectangle Rectangle;
}
edytowany 8x, ostatnio: Burmistrz
ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:5 miesięcy
  • Postów:273
0

Dla tych co nie znają tych nowych konstrukcji

Kopiuj
namespace ConsoleApp
{
    interface IInterfeis
    {
        int Wlasciwosc1 { get; set; }
        int Wlasciwosc2 { get; }
    }

        class Program
    {
        static void Main(string[] args)
        {
        }
    }

    class A : IInterfeis
    {
        int pole;
        public int Wlasciwosc1 { get => pole * pole; set => pole = value; }

        //public int Wlasciwosc2 => pole * pole; // skrócony zapis

        public int  Wlasciwosc2 { get => pole * pole; }

        public int Metoda1() => pole * pole; 
    }
}

edytowany 1x, ostatnio: Zimny Krawiec
CS
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 7 godzin
  • Postów:296
6

Robienie specjalnej klasy kwadratu wyprowadzonej z prostokąta to bezsens. Czy ktokolwiek robi klasę wyprowadzoną z Person, dla osób, które mają nazwisko identyczne z imieniem? Albo komponent, którego kolor wnętrza jest identyczny z kolorem obrysu itd. Kwadrat to szczególny prostokąt, wystarczy dodać np. metodę statyczną do tworzenia tego szczególnego prostokąta np. makeSquare(int size) plus metodę testującą czy nasz prostokąt spełnia ten szczególny przypadek równości obu boków.
Druga kwestia to możliwość istnienia dwóch identycznych obiektów, które są różnych typów. Robimy obiekt klasy Rectangle o bokach 2 i 2 i obiekt Square też o boku 2, jak teraz wybrać z kolekcji figur wszystkie kwadraty? Na podstawie klasy nie da się, więc po co nam ta klasa? W konsekwencji, trzeba zablokować tworzenia obiektów klasy Rectangle, których width i height są takie same. Więc odpada już tworzenie konstruktorem, zostają metody np. statyczne klasy Rectangle , które będą zwracać raz Rectangle a raz Square. A jeśli obiekt Rectangle jest mutowalny i zmieni swój height na wartość równą z width to co wtedy? Więc znowu nasze klasy powinny zwracać wyłącznie obiekty niemutowalne.
A jeśli już koniecznie trzeba rozróżniać obiekty na podstawie klas, to należy odwrócić sytuację i zrobić klasę Square i wyprowadzić z niej Rectangle, choć wydaje się to wbrew logice. Wtedy następuje rozszerzenie klasy o nowe pole, nowe metody, choć problemy nadal pozostają.

Azarien
W konsekwencji, trzeba zablokować tworzenia obiektów klasy Rectangle, których width i height są takie same - to wtedy musiałbyś tę klasę nazwać RectangleButNotSquare i tak mamy reductio ad absurdum.
DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:27 dni
  • Postów:105
0

Dlaczego Squere dziedziczy po Rectangle?
Lepiej byłoby zrobić klasę abstrakcyjną np: Shape która to ma pewną część wspólną..
Według mnie dziedziczenie Squere po Rectangle to jak dziedziczenie Ferrari po Maluchu.. :-(
Dobrze że ktoś przywołał Liskov - https://www.infragistics.com/community/blogs/b/dhananjay_kumar/posts/simplifying-the-liskov-substitution-principle-of-solid-in-c warto uczyć się pisać kod w ten sposób.

edytowany 2x, ostatnio: Deltech
Patryk27
Btw, źle wrzuciłeś link.
DE
Myślałem o tym w kontekście "zasady" :D
GironX
Tak uczciwie, to się zastanawiam, czy ten projekt jest wymyślony czy po prostu jeden z naszych dydaktyków nie zadał takiego zadania domowego do rozwiązania. Bo oczywiste jest że wychodzi się z shape, albo w ostateczności ze square, a i tak to jest mocno naciągane.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)