Forum: PC-Programmierung C# Interfaces geerbte Methode verstecken


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Torben (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich hab wie im Bespiel zwei Interfaces und würde mir gerne die 
doppelte Implementierung sparen, aber die Implementierung SubImp, soll 
die Methode Getkey() nicht enthalten.

Gibt es dafür eine bessere und einfachere Möglichkeit als meine Lösung?
1
 public interface IMain
2
        {
3
            void Hallo();
4
            void Test();
5
6
            void GetKey();
7
        }
8
9
        public interface ISub
10
        {
11
            void Hallo();
12
            void Test();
13
14
           
15
        }
16
17
        public class MainImp : IMain
18
        {
19
            public void GetKey()
20
            {
21
                throw new NotImplementedException();
22
            }
23
24
            public void Hallo()
25
            {
26
                throw new NotImplementedException();
27
            }
28
29
            public void Test()
30
            {
31
                throw new NotImplementedException();
32
            }
33
        }
34
35
        public class SubImp : ISub
36
        {
37
            private readonly MainImp _mainImp = new MainImp();
38
39
40
            public void Hallo()
41
            {
42
                _mainImp.Hallo();
43
            }
44
45
            public void Test()
46
            {
47
                _mainImp.Test();
48
            }
49
        }

von Horst S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich hoffe, ich habe Dich richtig verstanden?!

mit "virtual" z.b.:
1
    public interface IMain : ISub
2
    {
3
        void GetKey();
4
    }
5
6
    public interface ISub
7
    {
8
        void Hallo();
9
        void Test();
10
11
12
    }
13
14
   public class MainImp : SubImp, IMain
15
    {
16
        public void GetKey()
17
        {
18
            Hallo();
19
            Test();
20
        }
21
22
        public override void Hallo()
23
        {
24
            System.Diagnostics.Debug.WriteLine ("Hallo");
25
        }
26
27
        public override void Test()
28
        {
29
            System.Diagnostics.Debug.WriteLine("Test");
30
        }
31
    }
32
33
    public class SubImp : ISub
34
    {
35
        public virtual void Hallo()
36
        {
37
        }
38
39
        public virtual void Test()
40
        {
41
        }
42
    }

Geht aber auch mit "abstract", wenn Du willst dass SubImp nur in der 
Ableitung instanziiert werden kann.

von Ing (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Torben schrieb:
> Hallo, ich hab wie im Bespiel zwei Interfaces und würde mir gerne
> die doppelte Implementierung sparen, aber die Implementierung SubImp,
> soll die Methode Getkey() nicht enthalten.
> Gibt es dafür eine bessere und einfachere Möglichkeit als meine Lösung?


Hallo,
In deinem Beispiel enthält SubImp doch gar nicht die Implementierung von 
GetKey?

von Torben (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Horst,

danke für deine Antwort. In deinem Beispiel erbt IMain von ISub, wenn 
ich IMain nicht mehr ändern kann, dann fällt es flach oder?

@Ing:

Richtig, ich hab schon meine Lösung gepostet und ich hatte gehofft es 
geht irgendwie einfacher.

von Ing (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Torben schrieb:
> Hallo Horst,
>
> danke für deine Antwort. In deinem Beispiel erbt IMain von ISub, wenn
> ich IMain nicht mehr ändern kann, dann fällt es flach oder?
>
> @Ing:
>
> Richtig, ich hab schon meine Lösung gepostet und ich hatte gehofft es
> geht irgendwie einfacher.

Warum willst du nicht das SubImpl GetKey implementiert? Lass doch 
SubImpl beide Interfaces implementieren (Stichwort Interface 
Segregation) und delegier die Methoden von IMain an deine Main Klasse.

Wenn du nicht willst das von der Klasse SubImpl nicht auf SubImpl 
zugegriffen werden kann, sondern nur über IMain, dann implemtiet GetKey 
über ein explizites Interface.

Das geht dann so

class SubImpl : ISubImpl, IMain
{
 private Main Test = new Main();

string IMain.GetKey()
{
 Return Test.GetKey();
}

....
}

von Ing (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ing schrieb:

>
> Wenn du nicht willst das von der Klasse SubImpl nicht auf SubImpl
> zugegriffen werden kann, sondern nur über IMain, dann implemtiet GetKey
> über ein explizites Interface.
>
> Das geht dann so
>
> class SubImpl : ISubImpl, IMain
> {
>  private Main Test = new Main();
>
> string IMain.GetKey()
> {
>  Return Test.GetKey();
> }
>
> ....
> }

Meinte wenn du nicht willst das von SubImpl direkt auf GetKey 
zugegriffen werden kann, sondern nur über das IMain Interface, dann 
verwende die explizite Interface Implementierung. Sorry für den 
Schreibfehler oben

von Torben (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Warum willst du nicht das SubImpl GetKey implementiert?

Weil der Kunde nur eine abgespeckte Version bekommen soll und ich kann 
leider das MainInterface nicht mehr aufteilen.

Danke für eure Antworten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.