• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Interfejsy a klasy abstrakcyjne c#

Object Storage Arubacloud
0 głosów
1,518 wizyt
pytanie zadane 28 kwietnia 2017 w Rozwój zawodowy, nauka, praca przez tomek2323 Bywalec (2,050 p.)
edycja 28 kwietnia 2017 przez Eryk Andrzejewski

Mam mały problem ze zrozumieniem pewnych kwestii.

Jeżeli mam klasę absrakcyjną i w niej metodę abstrakcyjną, to muszę w klasie podrzędnej użyć w nazwie metody override. Natomiast w interfejsie wszystkie składowe są abstrakcyjne, ale w klasie podrzędnej nie muszę użyć słowa override - nawet nie mogę (pomimo jednego przypadku, zaraz go pokażę, bo to właśnie najwiekszy problem).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp44
{
    class Program
    {

        abstract class abstrakcyjna
        {
            public virtual void jeden()
            {
                Console.WriteLine(" funkcja abstrakcyjna jeden");
            }
            
           public virtual void dwa()
            {
                Console.WriteLine("funkcja abstrakcyjna   dwa ");
            }

           public abstract void trzy();

           public void zero()
            {
                Console.WriteLine("funkcja abstrakcyjna zero");
            }
            
        }

 

        interface interfejs
        {
            void wydaj_dzwiek();
            void wydaj_dzwiek2();
            void jeden();
            void zero();

        }

 

        class podrzedna:abstrakcyjna,interfejs
        {

            public override void  jeden()
            {
                Console.WriteLine("funkcja podrzedna jeden");
            }

 

            public override void trzy()
            {
                Console.WriteLine("funkcja podrzedna trzy");
            }

 

            public override void dwa()
            {
                Console.WriteLine("funkcja podrzedna dwa");
            }

            public virtual void wydaj_dzwiek()
            {
                Console.WriteLine("wydaje dzwiek");
                Console.Beep();
            }

           public  void wydaj_dzwiek2()
            {
                Console.WriteLine("wydaje dzwiek2");
                Console.Beep();
                Console.Beep();
            }

        }

        static void Main(string[] args)
        {

            podrzedna x = new podrzedna();
            x.jeden();
            x.dwa();
            x.trzy();

            Console.WriteLine("**************************");

           interfejs y=new podrzedna();

            y.jeden();//ta jest override (bo ta sama nazwa co w dziedziczonej?) i jej już nie muszę implementować tak?
            y.wydaj_dzwiek();// ta może być oznaczona virtual i wtedy bedzie mogla być dalej przeslaniana lub abstract ale wtedy klasa bedzie abstrakcyjna
            y.wydaj_dzwiek2();//standardowo przeslonieta
            y.zero();
            Console.ReadLine();
        }
    }
}

Pytanie nr 1: Czemu w klasie podrzędnej do składowej abstrakcyjnej używam override, a do takiej składowej z interfejsu już nie?

Pytanie nr 2: Czy jeżeli definiuję metodę o takiej samej nazwie z innej klasy, to sprawę interfejsu mam już z głowy (normalnie nie moge użyć override, a tutaj mogę, albo jeżeli moja klasa dziedziczy już metodę o takiej nazwie, to nic nie muszę robić). Zna ktoś podstawę czemu tak się dzieje? Dla mnie to trochę zakręcone i nie potrafię sobie tego ułożyć w logiczną całość .

 Z góry przepraszam za błędy.

komentarz 28 kwietnia 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Proszę o umieszczanie kodu w przeznaczonych do tego bloczkach. Do tego proszę zadbać w przyszłości o interpunkcję oraz polskie znaki diakrytyczne, które u Ciebie raz są, a raz ich nie ma wink

komentarz 28 kwietnia 2017 przez NowyUrzydgownig Mądrala (5,090 p.)
Aż chce się zaśpiewać pojawiam się i znikam :D
komentarz 28 kwietnia 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

laugh

W każdym razie jest poprawione już, jak mogę to poprawię, żeby komukolwiek się chciało to przeczytać :)

komentarz 28 kwietnia 2017 przez tomek2323 Bywalec (2,050 p.)
Niech Bog Ci to w dzieciach wynagrodzi :)

2 odpowiedzi

+1 głos
odpowiedź 28 kwietnia 2017 przez NowyUrzydgownig Mądrala (5,090 p.)
1. Bo override sygnalizuje, że nadpisujesz jakąś metodę. A z kolei w interfejsach nie masz metod, a jedynie deklaracje, czyli nazwy metod.

2. Jak klasa A, dziedziczy metodę m z klasy B oraz dziedziczy interfejs C w którym jest metoda m, to w klasie A nic nie musisz pisać, bo masz już tą metodę w klasie B, a ty z niej dziedziczysz.
komentarz 28 kwietnia 2017 przez tomek2323 Bywalec (2,050 p.)
No ok teraz bynajmniej jestem pewien .Ale jak mam klase Abstrakcyjną to tam tez tylko deklaruje metode abstrakcyjna(sama nazwa) i potem musi być override:)
komentarz 28 kwietnia 2017 przez NowyUrzydgownig Mądrala (5,090 p.)
Tak, bo mimo wszystko ty dziedziczysz z klasy. A w przypadku interfejsów tak nie jest. Jak byś zadeklarował tą metodę ale bez override, to byś ją przysłonił.(To znaczy stworzył nową metodę o tej samej nazwie).
0 głosów
odpowiedź 28 kwietnia 2017 przez Leszek Szymański Gaduła (3,180 p.)
Interfejsy to zupełnie coś innego, niż klasy abstrakcyjne. Klasa podrzędna implementuje interfejs, a dziedziczy klasę abstrakcyjną. Interfejsy nie mają "ciała" jak już zauważyłeś. Poczytaj najpierw definicje interfejsu i klasy abstrakcyjnej.
komentarz 28 kwietnia 2017 przez tomek2323 Bywalec (2,050 p.)
Siedze w c# dwa miesiace czytałem w dwuch ksiazkach i troche się pogubiłem choć wiem teraz że trzeba to rozgraniczyć ale czemu jest tak że jedna metoda jest dziedziczona i implementowana? za jednym razem skoro to coś innego?

Podobne pytania

0 głosów
1 odpowiedź 542 wizyt
pytanie zadane 15 września 2016 w C i C++ przez Tadeusz Jasińska Nowicjusz (190 p.)
+1 głos
3 odpowiedzi 1,055 wizyt
pytanie zadane 3 listopada 2018 w Java przez k222 Nałogowiec (30,150 p.)
0 głosów
2 odpowiedzi 322 wizyt
pytanie zadane 2 grudnia 2018 w Java przez itcloud Gaduła (3,380 p.)

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...