无法实现接口
本文关键字:接口 实现 | 更新日期: 2023-09-27 18:14:42
我是一个18岁的c#编程学徒(特别是在OOP '结构'方面)
我目前正在尝试学习接口的使用/有用性,但是…我有一段非常困难的时间尝试实际使用接口,我已经决定开始解决Project Euler中的问题。对于这些问题,我想做的是尝试实现接口或任何我需要学习的东西,这样我就可以获得一些经验。
我现在在做问题2,但是我想不出一个实现接口的方法。
所以在一般情况下,我想问的是,我能做到这一点(请不要给我最后的结果,我只是在寻找一个想法或帮助开始)
我觉得我被困在一个洞里,无法继续,所以我想要一些灵感,例子或字面上的任何东西,我可以得到好的和简洁的信息!:)
事先,非常感谢您的帮助/建设性的批评。
-致以最诚挚的问候,Niklas
斐波那契数列是…嗯…一个序列。因此,它可以:
-
按索引返回项
-
返回下一个数字
我建议用单个方法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);
}