Frage

Ich habe eine Schnittstelle (nennen wir es als IMessage), die ein Verfahren prüfen hat (), eine Klasse implementiert diese Schnittstelle

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    #region IMessage Members

    public bool Check()
    {
        //Some logic
    }
}

Das alles in Ordnung. Das Problem ist, dass ich nicht will, dass diese Methode (Datum ()) öffentlich sein, will ich es die asssembly internen halten, aber wenn ich es mache interne dann Compiler sagt es nicht die Schnittstelle implementieren. Es muss öffentlich sein, die Schnittstelle zu implementieren. Was kann ich tun?

War es hilfreich?

Lösung

Sie können eine Schnittstelle Methode implementieren, ohne es Teil der Klasse der direkten öffentlichen Schnittstelle zu machen, indem Sie explizite Schnittstellenimplementierung Syntax ( Entfernen den Qualifier und Präfix des Interface-Name die Methode ):

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    bool IMessage.Check()  { }
}

Es kann jedoch jeder, der an die IMessage-Schnittstelle umgewandelt kann noch prüfen () aufrufen können. Dies ist kein Weg, um einen Anruf zu dem Verfahren zur Verhinderung - nur die öffentliche Schnittstelle der Klasse Entrümpeln. Wenn die Schnittstelle ist intern für die Assembly, dann, dass nur Klassen konnte Montage es gegossen und die Methode aufrufen.

Generell .NET bietet keine Möglichkeit, nur bestimmte Methode einer Schnittstelle zu einer Implementierung der Schnittstelle intern zu machen. Dies ist ein Bereich, wo Sie wollen möglicherweise eine abstrakte Basisklasse betrachten - es Sie abstrakte Methoden geschützt schaffen können, die Erben ohne Aussetzen sie externe Anrufer implementieren können. Zum Beispiel:

abstract class MessageBase
{
    protected abstract bool Check();
}

class NewClass : MessageBase
{
    protected override bool Check() { ... }
}

Andere Tipps

Schnittstellen sind alle über, wie andere Objekte Schnittstelle mit dieser Art von Objekt, in einem öffentlichen Weg. Wenn andere Klassen sollen nicht die Check() Methode zugreifen, dann sollte das nicht Teil der Schnittstelle sein.

Hier ist eine MSDN Diskussion von diesem Thema, das hilfreich sein kann.

class NewClass : IMessage
{
    #region IMessage Members

    internal bool Check()
    {
        //Some logic
    }
    bool IMessage.Check()
    {
        return this.Check();
    }
}

Dies stellt eine interne Implementierung, nur für Klassen innerhalb der Baugruppe sowie ein explizite Schnittstellenimplementierung , dass Sie die Anforderungen der Schnittstelle erfüllen können. Für Code von einer externen Montage des Check Methode aufzurufen, wäre es eine IMessage Bezug auf Ihre Klasse benötigen, kein NewClass Referenz.

Alternativ können Sie eine abstrakte Methode auf einer Basisklasse verwenden:

public abstract class Message
{
    internal abstract bool Check();
}

public class MyMessage : Message
{
    internal override bool Check()
    {
        // do stuff
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top