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

Interfejsy a klasy abstrakcyjne c#

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,755 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ź 584 wizyt
pytanie zadane 15 września 2016 w C i C++ przez Tadeusz Jasińska Nowicjusz (190 p.)
+1 głos
3 odpowiedzi 1,246 wizyt
pytanie zadane 3 listopada 2018 w Java przez k222 Nałogowiec (30,150 p.)
0 głosów
2 odpowiedzi 730 wizyt
pytanie zadane 2 grudnia 2018 w Java przez itcloud Gaduła (3,380 p.)

93,435 zapytań

142,429 odpowiedzi

322,664 komentarzy

62,800 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

...