Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1696
Erhaltene Danke: 307

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 13.09.17 10:45 
Hallo Forum

Problemstellung:
Ich versuche einer Übersetzung von C# nach Pascal (und retour) gerecht zu werden und möchte verstehen, inwiefern sich die Modifier private und internal unterscheiden, wenn dabei eine innere/nested Klasse im Spiel ist:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public class ClassMain
{
    internal class ClassInternal { /*.../* }

    //private class ClassPrivate { /*.../* }
}

In Pascal ist mir internal nicht bekannt, daher versuche ich es stattdessen mit private:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TClassMain = class
  private
    type
      TClassPrivate = class
      // ...
      end;
  end;

Wie würde sich das nun auswirken, wenn die innere Klasse in C# private gesetzt werden würde? Gäbe es da einen nennenswerten Unterschied zum Modifier internal? Und wenn ja, welchen?

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18534
Erhaltene Danke: 1581

W10 x64 (Chrome, IE11)
Delphi 10.1 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 13.09.17 11:58 
internal beschränkt den Zugriff auf die gleiche Assembly. Das könnte man in Delphi höchstens mit den Packages vergleichen, wenn man diese denn zur Laufzeit verwendet, aber dafür gibt es kein vergleichbares Konzept. Deshalb würde hier public am ehesten dem entsprechen. Denn ohne Laufzeitpackages gibt es ja nur eine Exe bzw. DLL, die auf diese Klassen zugreifen kann.

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1696
Erhaltene Danke: 307

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 13.09.17 12:06 
Versteh' ich jetzt nicht. Warum public?

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4158
Erhaltene Danke: 824


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 13.09.17 12:28 
Weil es im allgemeinen näher an internal ist als private?
Im speziellen Fall, also je nachdem was du erreichen willst was nur ähnlich der verfügbaren Sichtbarkeiten ist, wäre die Antwort natürlich "kommt drauf an".

Zitat:
Wie würde sich das nun auswirken, wenn die innere Klasse in C# private gesetzt werden würde? Gäbe es da einen nennenswerten Unterschied zum Modifier internal? Und wenn ja, welchen?


Public Member einer privaten inner class sind nur für die umgebende Klasse erreichbar. Public Member einer internal inner class sind für alle Klassen in der Assembly erreichbar.

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1696
Erhaltene Danke: 307

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 13.09.17 12:52 
Danke! Dann habe ich internal wohl missverstanden.
Mir geht es darum ein interface im Delphi und im C# Projekt bereitzustellen, dass die Funktionalität der inneren Klasse aufweist. Dabei soll aber ein direkter Zugriff auf die innere Klasse nicht mehr möglich sein. Einzig das interface soll man nutzen können. Ob das nun in der Praxis so üblich ist, weiss ich nicht. Zumindest möchte ich es bei mir so umsetzen.
Sollte das kein guter Stil sein, bitte darauf hinweisen. ;)

Nachtrag

So ungefähr stell' ich mir das vor:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
namespace SomethingNew
{
    public class ClassMain
    {
        /* Modifier ??? */ class ClassNested : INested
        {
            public void DoSomething() { }
        }
    }
    
    public interface INested
}

// in einem fremden Projekt

public void ExecuteSomething()
{
    INested nested;
    nested.DoSomething();
}

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4158
Erhaltene Danke: 824


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 13.09.17 13:40 
Modifier = private

Das ist eigentlich ein ziemlich übliches Factory/Extension Pattern.
Konkretes Beispiel das ich kürzlich hatte :

In Microsoft.Owin kann man ein eigenes Filesystem implementieren. Dazu möchte Owin das man ein IFileSystem Interface implementiert und über dieses IFileSystem kommt man dann an IFileInfo Klassen zur Beschreibung der Files des Filesystems. In der Implementierung ist dann ganz natürlich die konkrete IFileInfo Implementierung eine private Klasse der konkreten IFileSystem Implementierung.

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1696
Erhaltene Danke: 307

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 13.09.17 13:58 
Dann ist mein Vorhaben garnicht so verkehrt. Was internal angeht, muss ich mir nochmal anschauen. Gut dass ich nachgefragt habe.
Danke an jaenicke und danke an Ralf Jansen!

Das Thema hat sich erledigt !!!

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
doublecross
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 98
Erhaltene Danke: 21

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: Mi 13.09.17 15:23 
Hallo,

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Dann ist mein Vorhaben garnicht so verkehrt. Was internal angeht, muss ich mir nochmal anschauen. Gut dass ich nachgefragt habe.


stelle dir vor dein Programm würde nicht alleine laufen, sondern es wäre eine Bibliothek (also quasi DLL statt EXE). Dann würdest du eine internal Klasse nur in deiner Bilbiothek nutzen können (für alle (internen) Objekte aus deiner Bibliothe wäre sie public). Definierst du die Klasse hingegen als public dann kann sie nicht nur von den Objekten aus deiner Bibliothek verwendet werden, sondern auch von denen aus dem Programm, dass wiederum deine Bibliothek verwendet. Sie wäre also "Programmübergreifend" public.

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1696
Erhaltene Danke: 307

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 13.09.17 16:16 
So hab' ich mir das auch gedacht. Die innere Klasse kann, muss aber nicht in der gesamten Assembly zur Verfügung stehen. Die innere Klasse darf nur nicht außen (in einer fremden Assembly) erreichbar sein. Deswegen auch das internal. Schlußendlich macht private mehr Sinn, denn die innere Klasse brauche ich eh sonst nirgends, in der besagten Assembly.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)