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.