2016-11-25 3 views
2

Ist es möglich, die Klasse einer Methode in einem Projekt zu deklarieren und in einem anderen zu implementieren? Etwas wie:Methode in einem anderen Projekt implementieren

namespace projectA 
{ 
    Class A 
    { 
     void toImplement() 
     { 
      //TODO 
     } 
     void print() 
     { 
       toImplement(); 
     } 
    } 
} 
namespace projectB 
{ 
    A.toImplement() 
    { 
     // print “projectB" 
    } 
} 
namespace projectC 
{ 
    A.toImplement() 
    { 
     // print “projectC" 
    } 
} 

Ich will nicht eine neue Klasse mit Vererbung erstellen, weil ich die Methode in der Klasse A. verwenden möchten, aber wenn ich die Methode in einem Projekt K definieren, wird das Verfahren tun das gleiche, wenn ich von der Projekt B. nennen

+0

Vielleicht könnten Sie 'A' abstrahieren und eine konkrete Klasse in' projectB' implementieren. Oder Sie könnten Erweiterungsmethoden verwenden. Oder eine Schnittstelle, vielleicht. –

Antwort

2

Sie können eine Erweiterungsfunktion siehe MSDN schreiben: Extension Function

Für nur das Hinzufügen Methoden, um es, - wie Sie in Ihrem zweiten Codebeispiel beschrieben - man könnte eine partielle Klasse verwenden

public static class B_Extensions 
{ 
    public static void SetString(this A a, string s) 
    { 
     a.Astring = s; 
    } 
} 

public class A 
{ 
    public string Astring { get; set; } 
} 
// In any other class 
private void DoSomething() 
{ 
    var a = new A(); 
    a.SetString("Something"); 
} 

Partial-Klasse: -

public partial class A 
{ 
    public void SetString(string s) 
    { 
     Astring = s; 
    } 
} 

public partial class A 
{ 
    public string Astring { get; set; } 
} 
+0

Erweiterungsmethoden können eine Lösung sein, sie haben jedoch keinen Zugriff auf geschützte Klassenmitglieder. – Sefe

+1

Gibt es einen Weg, um den SetString in Klasse A zu definieren (um ihn für die Methode zu verwenden), aber in einem anderen Projekt zu definieren? (siehe meine Bearbeitung) –

+0

@JackyDoe Sie wollen Sie in einem anderen Projekt überschreiben? Um es mir klar zu machen: Verwenden Sie 'A' als eine Art Assembly - also haben Sie drei Projekte in einer Lösung? Oder verwenden Sie all Ihre drei "Projekte als unterschiedliche Namespaces" in einem Projekt? – TripleEEE

3

die im selben Projekt stellen Sie eine abstrakte Methode erstellen können, aber es wird sein public in einem anderen Projekt zugänglich sein müssen:

namespace projectA 
{ 
    public abstract Class A 
    { 
     public abstract void toImplement(); 
    } 
} 

namespace projectB 
{ 
    public Class B : A 
    { 
     public override void toImplement() 
     { 
      //Implement here 
     } 
    } 
} 
+0

Oder er könnte es als eine weitere Option "virtuell" machen. Hängt von der Implementierung ab – Liam

+1

Es gibt eine Möglichkeit, etwas wie ohne eine neue Klasse zu erstellen? –

+0

@JackyDoe siehe [andere Antwort] (http://stackoverflow.com/a/40806224/542251) – Liam

0

Also meine rate ist der Grund, warum Sie nicht A abstrahieren und es in den anderen Projekten implementieren möchten, ist weil Sie new A() in der Bibliothek tun möchten.

In diesem Fall ist die Lösung daher, das Factory Pattern zu verwenden.

Sie machen die Methode abstrakt, und Sie deklarieren eine Factory-Schnittstelle.

namespace projectA { 
    Class A 
    { 
     abstract void toImplement(); 
    } 

    Interface AFactory 
    { 
     A create() 
    } 
} 

Dann in Ihrem Projekt, das diese verwendet haben Sie Ihre Implementierung von A und eine Fabrik machen.

namespace projectB 
{ 
    Class RealA extends A 
    { 
     void toImplement() { does stuff } 
    } 

    Class RealAFactory implements AFactory 
    { 
     A create() { return new RealA() } 
    } 
} 

Sie jetzt brauchen nur die Fabrik in die Bibliothek zu übergeben, wenn sie oder einige logisch Punkt in der Zeit initalising. Jetzt kann projectA eine neue Instanz von RealA bekommen, wann immer es von RealAFactory benötigt.

Verwandte Themen