C# Interfaces geerbte Methode verstecken

Gast #5011538
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
        }
Gast
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.
Gast
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?
Gast
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.
Gast
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();
}

....
}
Gast
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
Gast
>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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.