无法实现接口

时间:2015-09-25 12:52:19

标签: c# interface

我是一名18岁的c#编程学徒(特别是在OOP'结构')

我目前正在尝试学习接口的使用/实用性,但是......我非常难以尝试实际使用接口,我已经决定从{{3}开始研究问题}。我想对这些问题做的是尝试实现接口或我需要学习的任何东西,以便我获得一些经验。

我目前在Project Euler,但我无法想出实现接口的方法。

所以一般来说我想问的是,我能做什么以及如何做到这一点(请不要给我最终结果,我只是想要一个想法或帮助开始)

我觉得我被困在一个洞里,无法继续,所以我会喜欢一些灵感,例子或任何我可以获得良好和简洁信息的东西! :)

事先,非常感谢你的帮助/建设性的批评。

- 最诚挚的问候,尼克拉斯

4 个答案:

答案 0 :(得分:3)

Fibonacci序列是......好......一个序列。因此,它可以:

  1. 按索引返回项目

  2. 返回下一个号码

  3. 我建议使用单个方法ISequence创建一个接口GetNextElement()

    public interface ISequence
    {
        int GetNextElement();
    }
    

    然后,您可以在FibonacciSequence类中实现此接口:

    public class FibonacciSequence : ISequence
    {
        private int _lastElement1 = 0;
        private int _lastElement2 = 1;
    
        public int GetNextElement()
        {
            int result = _lastElement1 + _lastElement2;
            _lastElement1 = _lastElement2;
            _lastElement2 = result;
    
            return result;
        }
    }
    

    这将允许您实现其他序列,如算术级数等。

    P.S。我必须承认,为特定问题做界面并不是最好的主意,但出于学习目的 - 为什么不呢! :)

答案 1 :(得分:1)

在我看来,接口是一种软件工程工具。你可以在Project Euler问题上使用它们吗?绝对!毕竟,它们是一种工具......但它们的用处很小,而且非常有争议。

如果您想了解界面如何应用于现实世界,我强烈建议您学习设计模式。

一些可以帮助您入门的资源:

  • Wikipedia - 免费资源,但您将留在设备上
  • Head First Design Patterns - 我读过的最好的软件工程书......很好地涵盖了设计模式,并展示了Interfaces的实际用法。请注意,本书的编程语言是Java,但这无关紧要。无论语言如何,OOP都是OOP。

对于接口而言,这并不是所有关于接口的说法,但它是一个常见的真实世界场景,您可以看到所使用的接口。

答案 2 :(得分:0)

我宁愿实现类似的东西,而不是使用ISequence之类的东西:

  public static class Sequences {
    // Instead of reinveting the wheel (ISequence etc.), let's return  
    // IEnumerable<long> which is specially designed for such a cases
    public static IEnumerable<long> Fibonacci(long first, long second) {
      yield return first;
      yield return second;

      while (true) {
        long result = first + second;

        first = second;
        second = result;

        yield return result;
      }
    }
  }

  ...

  // Test: 10 first Fibonacci numbers:
  // 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
  Console.Write(String.Join(", ", Sequences.Fibonacci(1, 2).Take(10)));

  ...

  // Now having Fibonacci as IEnumerable<long>
  // you can easily answer a lot of questions via Linq:
  long result = Sequences.Fibonacci(1, 2)
    .TakeWhile(item => item < 4000000) // up to 4 millions
    .Where(item => item % 2 == 0)      // take even items only
    .Sum();                            // sum them up

为了实现接口而实现的任何接口是一种不好的做法。

答案 3 :(得分:0)

接口本质上是一个契约 - 如果您将描述实现该接口的代码(即具体结构)应该提供的功能,那么这是一个蓝图。

接口可能是一个难以完全处理的主题,而无需了解其应用程序。

以下是其中一些:

多重继承

C#不支持多重继承,即从多个类派生,因此实现多个接口实际上是您唯一的选择。

模拟框架

模拟框架用于您希望模仿对象行为但不实际运行它的地方。例如,在单元测试某些软件而不连接到真实服务或数据库时,您可能希望这样做。您只需简单地放入界面,然后描述给定输入的预期输出,它将创建一个与结果完全相同的模拟对象。

<强> IOC

控制反转是一种机制,在这种机制中,使用接口代替整个相关代码库中的具体结构。确切的实现因框架而异,但通常它们涉及某种工厂,您可以定义您正在使用的接口和结构,然后根据需要将实现接口的具体结果传递到各个层。好处是您可以在工厂中轻松更换凝固物,而无需更新上游代码。

一些示例代码,其中例程可以处理由于变量和参数定义为接口而不是具体结构的具体结果:

 public class Teaching
    {       
        public void RunTests()
        {
            ObjectA a = new ObjectA();
            ObjectB b = new ObjectB();
            IContract c = new ObjectA();
            IContract d = new ObjectB();

            Test1(a);
            Test1(b); // Won't compile

            Test2(b);
            Test2(a); // Won't compile

            // Test3 can handle either concretion            
            Test3(c); 
            Test3(d); 
        }

        private void Test1(ObjectA obj)
        {
            Console.WriteLine(obj.GetExcited("Yeah"));
        }

        private void Test2(ObjectB obj)
        {
            Console.WriteLine(obj.GetExcited("Yeah"));
        }

        private void Test3(IContract obj)
        {
            Console.WriteLine(obj.GetExcited("Yeah"));
        }

    }

    public class ObjectA : IContract
    {

        public string GetExcited(string data)
        {
            return data + "!";
        }
    }

    public class ObjectB : IContract
    {

        public string GetExcited(string data)
        {
            return data + "!!";
        }
    }

    public interface IContract
    {
        string GetExcited(string data);
    }