如何编写与基类

时间:2015-12-30 08:41:23

标签: c# c#-6.0

想法是拥有扩展我的功能的扩展方法。

所以不要有这样的东西:

 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方法作为扩展方法,但保留其他所有内容"更不一样"。

这可能吗?怎么做?

3 个答案:

答案 0 :(得分:6)

另一种解决方案是让您的Storage类实际存储一些内容:

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();

答案 1 :(得分:2)

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

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

然后你可以使你的添加方法类似于:

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

答案 2 :(得分: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);
    }
}

这几个类,你可以调用这样的方法

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

如果您希望AddGetFirst成为扩展方法,则可以使用StorageValue类进行此操作。但是进入StorageValue类本身更有意义。

那就是说,@ Manuel Zelenka的答案与我的相似,看起来更好。你可以调整它们中的任何一个。

相关问题