Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

22.07.2014, 19:04

Er greift in seinem Beispiel aber von außen darauf zu. Also soll es nicht private sein. Oder der TE hat sich etwas unmissverständlich ausgedrückt. Soll das ganze nicht nach außen hin sichtbar sein so gibt es halt protected. Das wäre im Prinzip genau das was gesucht ist. public, protected und private müssten an sich ausreichen. Wenn du auf andere Fälle kommst so können wir die mal konkret hier diskutieren. Vermutlich würde sich das ganze aber durch Verbesserungen am Design ändern lassen. Das können wir dann aber konkret gucken.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

12

23.07.2014, 09:17

Man beachte den Kommentar dahinter: "die Eigenschaft text sollte garnicht in intelisense angezeigt werden"
protected sollte wirklich grundsätzlich ausreichen, wenn abgeleiteten Klassen Member oder Methoden zur Verfügung gestellt werden sollen, nur scheint er die Besonderheit gefunden zu haben, dass er nur während der Initialisierung Zugriff benötigt.

Ich habe ja bereits die Frage gestellt, welcher konkreter Anwendungsfall dahinter steckt, nur bisher hat er nicht geantwortet... ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

13

23.07.2014, 16:12

Ich bin mir unsicher, aber ist so etwas nicht in C++ möglich, mittels einem konstanten protected-Member? Etwa so:

C-/C++-Quelltext

1
2
3
4
5
class Foo
{
protected:
    const int mMyInt;
};


Normalerweise müsste so etwas doch auch in C# gehen, oder?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

14

23.07.2014, 20:21

Die Frage ist nicht, ob es geht, sondern warum er das eigentlich vor hat. Sehr wahrscheinlich wird es für das, was er vor hat, einen besseren Weg geben (und wenn es nur Parameter im Konstruktor der Basisklasse sind).
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

15

24.07.2014, 17:01

Es tut mir leid, das ich mich nicht gemeldetz habe, hatte viel zu tun :/

auf jeden Fall sollte es so sein, das meine Klasse nicht abstrakt sein soll, ich möchte sie gerne vererben aber auch noch selber instanziieren.

Und wenn sie selbst instanziierbar sein soll, dann darf es nicht sein, das abgeleitete Klassen, wenn sie instanziiert werdenm, die Methoden und variablen der Basisklasse sehen, die nur wichtig sind, während des Erbvorgangs sprich:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 public class B : A
{
    public MethodB()
     {
         string b = base.GetSomethingfromBaseclass();
     }
}

static void Main()
{
   B b = new B();
   b.GetSomethingfromBaseclass(); // in meinem Fall sieht die abgeleitete Klasse beim instanziieren sie, was nicht sein sollte
 

   // Basisklasse instanziieren
   A a = new A();
   a.GetSomethingfromBaseclass() // das will ich hinbekommen


   //Das gleiche Spiel natürlich mit Eigenschaften

}



Mfg

JungleProgger

P.s(Doch die Frage ist ob es geht^^, wie gesagt, der Nutzen ist das die Baseclass auch gebaut werden soll)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »JungleProgger« (24.07.2014, 17:08)


Tobiking

1x Rätselkönig

  • Private Nachricht senden

16

24.07.2014, 17:33

Das was du vorhast, widerspricht der Polymorphie. Denn folgendes wäre damit nicht mehr möglich:

C#-Quelltext

1
2
A b = new B();
b.GetSomethingfromBaseclass();


Damit hast du keine "B ist ein A" Beziehung und die Vererbung ist hier fehl am Platz. Dein B kann aber ein A enthalten und entsprechend nur die Methoden und Properties anbieten die es soll. Das sollte sich sogar über vererbte Interfaces absichern lassen, wenn ich mich nicht irre:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public interface IMethodsForAll
....

public interface IMethodsForA: IMethodsForAll
...
GetSomethingfromBaseclass
...

public class A : IMethodsForA
...

public class B : IMethodsForAll
{
  MethodsForAll a = new A();
...
}

static void Main()
{
  IMethodsForAll b = new B();
  b.GetSomethingfromBaseclass(); // Gibt es nicht!

  IMethodsForA b = new B(); // B implementiert MethodsForA nicht!
  b.GetSomethingfromBaseclass();

  IMethodsForA a = new A();
  a.GetSomethingfromBaseclass(); // Klappt

  IMethodsForAll a = new A();
  a.GetSomethingfromBaseclass(); // Gibt es nicht!


B ist damit gezwungen alle frei zugänglichen Methoden zu implementieren, und kann dafür auch nur die frei zugänglichen Methoden von A verwenden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Tobiking« (24.07.2014, 17:41)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

24.07.2014, 18:10

Wie Tobiking schon schreibt hast du da einen Denkfehler. Sprachen wurden da nun mal anders gedacht. Neben der schon genannten Methode geht es noch anders. Du machst eine Basisklasse die so fungiert wie eine Basisklasse es eigentlich soll. Das heißt alles was hier drin steht muss auch in den abgeleiteten Klassen vorhanden sein. Jetzt leitest du einmal deine Klasse A ab und zusätzlich deine Klasse B.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class BaseClass
{
    // Code der Basisklasse ist in allen abgeleiteten Klassen vorhanden
}

class A : BaseClass
{
    public int GetSomethingfromBaseclass()
    {
        // ...
    }
}

class B : BaseClass
{
    // ...
}


Jetzt hat A Methoden die B nicht kennt und beide haben die selbe Basisklasse. Ansonsten funktioniert das was du willst wie gesagt nur intern indem du private und protected richtig anwendest.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige