Hej Jag kan inte C# något vidare, så lita inte helt på vad jag säger (skriver?). Jo, men det är ju just själva deklarationen jag vill undvika. Exempel: Menar du något i den här stilen? Ja i så fall så är det inte som i c++. Ja, fast utan att deklarera metoden som virtual i B... abstrakt klass och interface är ju inte riktigt samma sak... En variant utan definition blir. (I min värld skiljer man på deklaration och definition men det är i min värld som sagt.) >interfacet gör ju att du kan ha en typ av multipelt arv...som arv men ändå inte...utan tvingar dig att implementera metoder... C++ motsvarighet till interface är protokoll-klasser. Hej Niklas, Jaja, det ser ut som att de kommer bli mycket copy, paste efter min konvertering...*SUCK* så går det när man försöker vara smart... Lessen, det var verkligen inte meningen att förstöra tråden på det viset. >bara för att Microsoft hittar på nya saker (som jag ser som onödiga) så känns det lite irriterande. >Du kan säga vad du vill om Interfaces men jag tycker det är en grym grej... >Fast jag tror inte att det är Microsoft som kommit på interfaces eftersom de även finns i Java. Yepp, du har rätt men det är lite svårt om du har en struktur med en abstrakt klass som implementerar mer än ett interface. I mitt fall implementerar den abstrakta klassen 3 interfaces. Och då vill jag ju inte deklarera alla metoderna i den abstrakta klassen...utan jag vill ju bara implementera alla metoder i klasserna som ärver... Kan denna variant vara något? hehe...om det bara hade varit så lätt...min "B" håller en del andra metoder plus konstanter som används av de fyra klasser som ärver den...Abstrakta klasser och interfaces
Konverterade några klasser från ett STORT projekt i Java till C#...
Problemet är att vi har en massa abstrakta klasser i Java som implementerar diverse interfaces. I java behöver man ju inte implementera metoderna i abstracta klasser eftersom man kan göra det i en klass som ärver. Tyvärr så verkar det inte vara samma i C# eller?
Finns det nåt sätt så man slipper skriva in alla metoderna i den abstrakta klassen eller finns det nån annan lösning???
/JohanSv: Abstrakta klasser och interfaces
I C++ (som ju c# tydligen skall bygga på) är det dock så att abstrakta basklasser inte behöver defininera en enda medlemsfunktion, så länge de definieras som fullständigt virtuella.
I C++ används
class bla
{
public:
virtual void VirtuellFunktion() = 0;
}
Om det nu inte är så i C# (med reservation för syntaxen) så är det ju löjligt.
/Niklas JanssonSv: Abstrakta klasser och interfaces
Interface A har metoden call()
Abstrakt klass B implementerar A
Klass C ärver B och implementerar metoden call()
Alltså ingen deklaration av call() i B...
/JohanSv: Abstrakta klasser och interfaces
/CO
interface IA
{
string call();
}
class B : IA
{
public virtual string call()
{
return "result B";
}
}
class C : B
{
public override string call()
{
return "result C";
}
}Sv: Abstrakta klasser och interfaces
Dessa j*vla påfund: Interface!!
Vad var det för fel på en abstrakt basklass - bara? Det är ju det som är interface. Gillar INTE C#. Usch!
Microsofts smarta idéer: "om vi tar gamla, väl uttänkta och väletablerade koncept som fungerar bra - byter namn på dem och gör så att de inte fungerar som folk förväntar sig längre - så måste väl det vara bättre!"
/Niklas JanssonSv: Abstrakta klasser och interfaces
Det kanske inte funkar....
Måste kanske ge mig i att Java och C# inte funkar riktigt på samma sätt :)
/JohanSv: Abstrakta klasser och interfaces
interfacet gör ju att du kan ha en typ av multipelt arv...som arv men ändå inte...utan tvingar dig att implementera metoder...
Man kan göra riktigt bra strukturer med interfaces och abstrakta klasser...
/JohanSv: Abstrakta klasser och interfaces
interface IA
{
string call();
}
abstract class B : IA
{
public abstract string call();
}
class C : B
{
public override string call()
{
return "result C";
}
}
Notera att klasser bara kan ärva en annan klass men de kan implementera flera interface. Ett interface kan "ärva flera interface".Sv: Abstrakta klasser och interfaces
En abstrakt klass i C++ innebär att:
-du kan inte instansiera objekt som inte definierar alla rent virtuella funktioner (metoder), dvs. du måste definiera rent virtuella funktioner.
-vanliga virtuella funktioner måste inte definieras av subklassen, men man får.
-icke virtuella funktioner skall (bör) inte definieras av subklassen.
-du måste ärva klassen, och du kan ärva den hur multiplet du vill.
Ett interface är bara en fånig variant på abstrakta klasser.
/Niklas JanssonSv: Abstrakta klasser och interfaces
protokoll-klass: En class med en uppsättning rent virtuella funktioner, som måste definieras i alla klasser som ärver klassen.
Vidhåller min uppfattning om att C# är bort om all förtvivlan värdelöst!
/Niklas JanssonSv: Abstrakta klasser och interfaces
jag brukar avstå från religösa diskussioner och du får gärna ha din åsikt. Vad jag har lärt mig genom åren är att språk kommer och språk går. Dessutom är olika språk lämpliga till olika ändamål.
En liten fråga bara: Varför skriver du i detta forum om du bara skriver ner C#? Meningen är väl att vi skall hjälpa varandra?
/COSv: Abstrakta klasser och interfaces
Niklas: Du kan säga vad du vill om Interfaces men jag tycker det är en grym grej...sen om det är c++ kompatibelt det är ju en helt annan grej. Som jag ser det är C# ett språk som tillåter att du programmerar C++ - likt eller Java-likt eller blandar det lite. Grejen är ju att du inte BEHÖVER göra som i det ena eller det andra. Man har helt enkelt lite valfrihet..
/Johan
I Java kan man ju typ göra så här:
interface IA
{
string call();
}
abstract class B : IA
{
}
class C : B
{
public override string call()
{
return "result C";
}
}Sv: Abstrakta klasser och interfaces
Jag håller med dig i det du säger om att språk kommer och går.
Har en lite dålig dag, och när man ser hur Johan behöver skriva om sina klasser - bara för att Microsoft hittar på nya saker (som jag ser som onödiga) så känns det lite irriterande.
Jag kan inte säga att c# bara är dåligt, men ur min (och Bjarne Stroustrup's) synvinkel så är det nästan bara syntaxen som är någorlunda gemensam mellan språken.
Hittils har jag inte hittat någonting som har övertygat mig om att lära mig C#. Hela grejen med C++ är att man inte introducerar massa nya keywords och inte har något som är plattformsberoende.
Väntar istället med spänning på C++0x
/Niklas JanssonSv: Abstrakta klasser och interfaces
Fast jag tror inte att det är Microsoft som kommit på interfaces eftersom de även finns i Java. Däremot så behandlar inte Java och C# Abstrakta klasser som implementerar Interfaces på samma sätt...se ovan
/Johan - som drar på semester istället...Sv: Abstrakta klasser och interfaces
Jag med!
Men istället för att skriva (använder ditt exempel):
interface IA
{
string call();
}
abstract class B : IA
{
}
class C : B
{
public override string call()
{
return "result C";
}
}
Så tycker jag att det går lika bra med:
class IA
{
public:
virtual string call()=0; //måste definieras någon annanstans
//klassen blir abstrakt
}
class B : IA
{
//B blir också abstrakt eftresom inte call blir definierad
}
class C : B
{
public:
string call()
{
return "result C";
}
}
Om man sedan vill ärva C ytterligare kan man göra call virtuell, och sedan välja om man vill definiera i andra klasser eller inte - det kallar jag valfrihet!
/Niklas JanssonSv: Abstrakta klasser och interfaces
Nej, det har du nog rätt i, men därför är det ju ganska uppenbart att C# inte vänder sig till tidigare C++-anhängare!
C++ är ett "rent" språk. Varenda detalj är genomtänkt. Tänk dig att du har en rolex och en casio. Rolexen är snygg och uttänkt (undrar vilken jag tycker är rolex... :-) ), medan casion är lätt att lära sig, men lite plastig.
Sätt sedan ihop de båda klockorna till en. Hälften plast, hälften guld. Båda delarna blir löjliga!
/Niklas JanssonSv: Abstrakta klasser och interfaces
/JohanSv: Abstrakta klasser och interfaces
interface IA
{
string call();
}
interface IB : IA
{
}
class C : IB
{
public string call()
{
return "result C";
}
}
/COSv: Abstrakta klasser och interfaces
Nä, det blir nog att inse fakta...copy & paste is fun...
/Johan