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

1

21.07.2014, 14:58

C# Ein praktischer Zugriffsmodifizierer?

Hey Leute,

ich habe eine Frage bezüglich Zugriffsmodifikatoren einer Basisklasse.

Ein Beispiel:


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
public class A
{
     protected int i {get; set;}
     (<neuer Zugriffsmodifikator>) string text {get; set;}
}

public class B : A
{
    public B() : base(A)
    {
           i = 10;
text = "hallo"; //Compilierfehler, text ist in abgeleiteten Klassen nicht sichtbar
    }
}

class Program
{
   static void Main()
   {
        A a = new A();
        a.text = "moin"; // das darf funktionieren

    B b = new B();
    b.text = ???? // die Eigenschaft text sollte garnicht in intelisense angezeigt werden, aufgrund des neuen Zugriffsmodifikators
   }
}


Meine Frage ist jetzt, wieso gibt es kein Schlüsselwort, was besagt, das diese Variable nur dann sichtbar ist, wenn klasse A instanziiert wird.

also die variable i ist nur in B und A sichtbar, aber die Variable text soll nicht in B sichtbar sein, aber wenn klasse A instanziiert wird und mann über intelisense auf text zugreifen möchte, dann ist es sichtbar.

Gibt es evtl. ein solches Schlüsselwort oder würde dieses keinen Sinn machen?

persönlich fände ich es schon sinnvoll, denn ich möchte A gerne vererben, dennoch A aber weil es nicht so abstrakt ist, auch instanziieren.

und einige Daten die B von A benötigt, hat B auch, wiederum Daten die nur A haben sollte, sind in B nicht sichtbar, egal ob man B instanziieren möchte oder nur privat in B verwenden will, sie sollten B garnicht zu verfügung stehen.

Ich bin über eure Meinungen gespannt :)

Mfg

JungleProgger

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

21.07.2014, 15:05

Es gibt einen Unterschied zwischen "B kann die privaten Member von A sehen" (was nicht der Fall ist) und "IntelliSense zeigt dem Programmierer private Member des Parents an". Letzteres ist eben so. Allerdings haben sie anderes Symbol, womit die Sichtbarkeit offensichtlich wird.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

21.07.2014, 15:13

Ok, das habe ich verstanden, aber in Hinblick auf meine Frage, gibt es denn sowas, damit nicht die abgeleiteten Klassen jede Basisklassendaten sehen. Also es ist eine "normale" und Basisklasse. Wenn es eine rein abstrakte Klasse wäre, würde ich die frage nicht stellen, denn abstract member überhaupt nicht instanziiert werden und somit alles auf die Subklassen fällt. Ich finde den Gedanken nur interessant wenn man eine Baisklasse zuverfügung stellt und sie dennoch instanziierbar aus Sicht des Anwendungsfalls aus, ist.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

4

21.07.2014, 15:21

Stell die zu schützenden Felder der Basisklasse auf private. Dann kannst du sie nur in der Basisklasse sehen und nicht in abgeleiteten Klassen. Dazu muss die Basisklasse nicht abstrakt sein.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

5

21.07.2014, 15:24

das kann ich ja nicht machen, denn der Gedanke ist nur, das die Basisklasse sie nur innerhalb sieht(private gibt es dafür ja), aber auch halt wenn sie instanziiert wird.

das geht ja nicht bei private.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

6

21.07.2014, 16:14

Mach betreffende Felder private und füge der Basisklasse einen Konstruktor hinzu, der die Werte für diese Felder entgegen nimmt. Beim Aufruf des Konstruktos von B können betreffende Parameter an den Konstruktor von A weitergereicht werden.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

7

22.07.2014, 13:19

und kann ich das auch für Funktionen so machen, das gleiche: Funktion in subklasse unsichtbar und in keinsterweise benutzbar und beim Instanziieren der Basisklasse Funktion sichtbar und benutzbar?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

8

22.07.2014, 13:56

Aufruf aus Konstruktor der Basisklasse heraus.

Aber mal eine Gegenfrage: wofür denkst du denn, dass du eine solche Konstellation brauchen wirst? (Sehr wahrscheinlich wird es auch bessere Möglichkeiten geben, wie man das lösen kann, abhängig davon, was du eigentlich erreichen willst.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

22.07.2014, 14:09

Mit einer öffentlichen Vererbung drückt man aus, dass B ein A ist. Also ein Karpfen ist z.b. ein Fisch. Jeder Fisch kann schwimmen. Würde es Fische geben, die nicht schwimmen können, hätte die Fähigkeit nichts in der Basisklasse zu suchen. Die Fähigkeit ist so allgemein, dass sie für alle Fische gelten muss. Wenn das nicht der Fall ist, ist die Basisklasse falsch definiert.

Was würde einen daran hindern soetwas zu machen?

C-/C++-Quelltext

1
2
3
B b = new B();
A a = b;
a.text = ????
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

10

22.07.2014, 14:59

Mit einer öffentlichen Vererbung drückt man aus, dass B ein A ist. Also ein Karpfen ist z.b. ein Fisch. Jeder Fisch kann schwimmen. Würde es Fische geben, die nicht schwimmen können, hätte die Fähigkeit nichts in der Basisklasse zu suchen. Die Fähigkeit ist so allgemein, dass sie für alle Fische gelten muss. Wenn das nicht der Fall ist, ist die Basisklasse falsch definiert.

Was würde einen daran hindern soetwas zu machen?

C-/C++-Quelltext

1
2
3
B b = new B();
A a = b;
a.text = ????

Ich denke es ist so gemeint, dass text grundsätzlich privat sein soll, aber eine Zuweisung aus dem Konstruktor der abgeleiteten Klasse heraus möglich sein soll. (Und es scheint auch, dass meine Antwort weitergeholfen hat.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige