简体   繁体   中英

Make methods work independently without using a common method

I am currently trying to separate out the method implementation so that they can work independently. The methods that I am trying to separate are store and checker. Both these methods require the traverse method. My current implementation has two method store and checker methods which I have separated them into different classes. They require to be called within the traverse method to work. This is the my current implementation.

class Traverse
{
    public void traversemethod()
    {
        Console.WriteLine("Traverse function");
        Checker r = new Checker();
        r.checkermethod();
        Store s = new Store();
        s.storemethod();
    }
}

class Checker
{
    public void checkermethod()
    {
        Console.WriteLine("Checker function");            
    }
}

class Store
{
    public void storemethod()
    {
        Console.WriteLine("Store function");
    }
}

class Compute
{
    public static void Main()
    {
        Console.WriteLine("Main function");
        Traverse v = new Traverse();
        v.traversemethod();

        Console.ReadLine();
    }

Is there any way by which I can implement them separately without declaring them together in traverse method and calling both store and checker method separately in the main function. I can implement the traverse method in both store and checker method, but i was wondering if there is any way to do it rather than duplicating the same code again.

Sounds like a perfect place to use a lambda:

public delegate void TraverseDelegate();
public void traversemethod(TraverseDelegate dlg){
    Console.WriteLine("Traverse function");
    dlg();
}

and in the Main method use:

Traverse v = new Traverse();
v.traversemethod(() => {
    Checker r = new Checker();
    r.checkermethod();
    Store s = new Store();
    s.storemethod();
});

EDIT/UPDATE(=UPDIT :-) )

You can also make the delegate a member field of Traverse , and then pass it as a constructor argument and call traversemethod without any arguments:

public class Traverse{
    public delegate void TraverseDelegate();
    private TraverseDelegate dlg;

    public Traverse(TraverseDelegate dlg){
        this.dlg=dlg;
    }

    public void traversemethod(){
        Console.WriteLine("Traverse function");
        dlg();
    }
}

and in the Main method use:

Traverse v=new Traverse(()=>{
        Checker r = new Checker();
        r.checkermethod();
        Store s = new Store();
        s.storemethod();
});
v.traversemethod();

I'm not about the relationship between Checker and Store so I'll show an example with an interface instead of a base class. However you could create a base class, possibly abstract, and have each child class implement their special method.

interface IPerformMethod    
{
   void SpecialFunction();
}

public class Store : IPerformMethod
{
   public void SpecialFunction()
   {
       Console.WriteLine("Store function");
   }
}

public class Checker : IPerformMethod
{
   public void SpecialFunction()
   {
       Console.WriteLine("Checker function"); 
   }
}

Then in your TraverseMethod , you could pass in an object that implements IPerformMethod (in this case it's either an instance of Checker or Store ).

public void TraverseMethod(IPerformMethod item)
{
   Console.WriteLine("Traverse function");
   item.SpecialFunction();
}

//To call the method 
TraverseMethod(new Checker());
TraverseMethod(new Store());

(Obviously you can rename the IPerformMethod interface to something more descriptive but if I understand the question correctly, this seems to be what you want).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM