无法实现接口

本文关键字:接口 实现 | 更新日期: 2023-09-27 18:14:42

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

我目前正在尝试学习接口的使用/有用性,但是…我有一段非常困难的时间尝试实际使用接口,我已经决定开始解决Project Euler中的问题。对于这些问题,我想做的是尝试实现接口或任何我需要学习的东西,这样我就可以获得一些经验。

我现在在做问题2,但是我想不出一个实现接口的方法。

所以在一般情况下,我想问的是,我能做到这一点(请不要给我最后的结果,我只是在寻找一个想法或帮助开始)

我觉得我被困在一个洞里,无法继续,所以我想要一些灵感,例子或字面上的任何东西,我可以得到好的和简洁的信息!:)

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

-致以最诚挚的问候,Niklas

无法实现接口

斐波那契数列是…嗯…一个序列。因此,它可以:

  1. 按索引返回项

  2. 返回下一个数字

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

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;
    }
}

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

注:我必须承认,为那个特定的问题做接口并不是最好的主意,但是为了学习的目的——为什么不呢?:)

在我看来,接口是一种软件工程工具。你能把它们用在欧拉项目的问题上吗?绝对的!毕竟它们是一种工具....但它们的有用性很小,而且非常值得商榷。

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

一些资源让你开始:

  • 维基百科-免费资源,但你留下你的设备
  • Head First Design Patterns -我读过的最好的软件工程书籍…很好地涵盖了设计模式,并展示了接口的实际用法。请注意,本书的编程语言是Java,但这并不重要。不管使用什么语言,OOP都是OOP。

注意,这并不是关于接口的全部内容,但这是一个常见的现实世界中使用的接口场景。

而不是使用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

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

接口本质上是一个契约——如果你愿意的话,它是一个蓝图,描述了实现接口(即接口)的代码应该提供哪些特性。

如果不了解接口的应用程序,接口可能是一个很难完全掌握的主题。

下面是一些例子:

多重继承

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

<<p> Mocking框架/strong> mock框架用于您希望模拟对象的行为但不实际运行它的地方。例如,当单元测试某些软件而不连接到实际服务或数据库时,您可能希望这样做。您只需放入接口,然后描述给定输入的预期输出,它将创建一个行为与实例完全相同的模拟对象。 国际奥委会

控制反转是一种在相关代码库中使用接口代替实例的机制。具体的实现因框架而异,但通常它们涉及某种工厂,您可以在其中定义要使用的接口和接口,然后实现接口的接口根据需要在各层之间传递。好的方面是你可以很容易地在工厂里换出绑定,而不需要更新上游代码。


由于变量和参数被定义为接口而不是抽象,例程可以处理抽象的一些示例代码:

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