Forum: PC-Programmierung C# Interfaces geerbte Methode verstecken


von Torben (Gast)


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)


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)


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)


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)


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)


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.