C# Interfaces geerbte Methode verstecken

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

....
}
Gast #5011627
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
Gast #5011669
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren