2015-12-30 53 views
3

想法是使用扩展方法来扩展我的功能。如何编写使用基类的扩展方法

所以不是有这样的事情:

return Add(Add(storage.GetFirst(), 3), 7); 

我想有这样的事情:

return storage.GetFirst().Add(3).Add(7); 

问题的扩展方法是,他们必须在静态类静态的。 这是我想要做的简化例子。

public class Storage 
    { 
     public int GetFirst() 
     { 
      return 100; 
     } 
     public int GetAll(int x, int y) 
     { 

      // ... 
      return x + y; 
     } 
    } 
    public abstract class MyBase 
    { 
     protected Storage storage; 
     protected MyBase() 
     { 
      storage = new Storage(); 
     } 

     public int Add(int what, int howMuch) 
     { 
      return storage.GetAll(what, howMuch); 
     } 

    } 

    public class MyClass : MyBase 
    { 
     public int method1() 
     { 
      return Add(Add(storage.GetFirst(), 3), 7); 

      //I want have something like this: 
      // return storage.GetFirst().Add(3).Add(7); 
     } 
    } 

当然,存储类别,MyBase和MyClass的不能是静态的。逻辑简化有一个干净而简单的例子,所以类之间的关系必须保持一致。 我想要做的是使Add方法成为扩展方法,但是让所有其他方面“更少一样”。

这可能吗?

+2

学习流利的代码模式。你的方法必须返回相关类的实例。 –

+0

@FarhadJabiyev - “相关类”是什么意思? – Enigmativity

回答

6

另一种解决办法是让你的存储类实际上存储东西:

public class Storage 
{ 
    private int currentValue; 

    public Storage GetFirst() 
    { 
     this.currentValue = 100; 
     return this; 
    } 

    public Storage Add(int toAdd) 
    { 
     this.currentValue += toAdd; 
     return this; 
    } 

    public int GetResult() 
    { 
     return this.currentValue; 
    } 
} 

这样你的电话会是:

int result = new Storage().GetFirst().Add(3).Add(5).GetResult(); 
+0

我想出了类似的东西。 +1 :) –

+0

存储确实存储了一些东西,我只是简化了代码。我喜欢你的解决方案。 – Raskolnikov

2

有扩展一个静态类,并使用类似:

internal static T Map<T> (this int source, Func<int, int, T> function, int extraParam) { 
    function (source, extraParam); 
} 

然后你就可以让你的add方法是这样的:

storage.GetFirst().Map (Add, 3).Map (Add, 7); 
+0

这是什么“=> function(source,extraParam);” ?你可以说得更详细点吗。 – Raskolnikov

+0

这就是C#6不需要的功能'{}',如果它只有一个语句。编辑为旧的语法。 –

+0

O,很高兴知道。 Thaks – Raskolnikov

2

如果不修改任何代码,就可以实现您正在尝试执行的操作。但是你现在的设计很难做到。你应该在Storage类中有一些存储空间。尽管有名字,但在Storage类别中没有储存空间。

public class StorageValue 
{ 
    public StorageValue(Storage storage) 
    { 
     this.Storage = storage; 
    } 

    public StorageValue(Storage storage, int value) 
    { 
     this.Storage = storage; 
     this.Value = value; 
    } 

    public Storage Storage { get; private set; } 
    public int Value { get; private set; } 

    public StorageValue GetFirst() 
    { 
     return new StorageValue(Storage, Storage.GetFirst()); 
    } 

    public StorageValue Add(int value) 
    { 
     return new StorageValue(Storage, Storage.GetAll(Value, value)); 
    } 

    public int GetValue() 
    { 
     return Value; 
    } 
} 

public static class StorageExtensions 
{ 
    public static StorageValue ToStorageValue(this Storage storage) 
    { 
     return new StorageValue(storage); 
    } 
} 

以下哪几类,您可以如果你想AddGetFirst是扩展方法调用此类

public class MyClass : MyBase 
{ 
    public int method1() 
    { 
     return storage 
      .ToStorageValue() 
      .GetFirst() 
      .Add(3) 
      .Add(7) 
      .GetValue(); 
    } 
} 

的方法,你可以用StorageValue类现在就做。但更有意义的是在StorageValue课堂本身。

也就是说,@ Manuel Zelenka的答案与我的看起来更好。你可以适应其中的任何一个。