gpt4 book ai didi

具有默认方法与特征的 C# 接口(interface)

转载 作者:行者123 更新时间:2023-12-04 01:35:59 24 4
gpt4 key购买 nike

在 Scala 文档中,https://docs.scala-lang.org/tour/traits.html , 它给出了一个特征的例子。

trait Iterator[A] {
def hasNext: Boolean
def next(): A
}

class IntIterator(to: Int) extends Iterator[Int] {
private var current = 0
override def hasNext: Boolean = current < to
override def next(): Int = {
if (hasNext) {
val t = current
current += 1
t
} else 0
}
}


val iterator = new IntIterator(10)
iterator.next() // returns 0
iterator.next() // returns 1

我们知道 C# 尚不支持特征。但是,上面的示例可以轻松转换为 C# 代码:

interface Iterator<A> 
{
bool HasNext();
A Next();
}

public class IntIterator : Iterator<int>
{
int _to;
int _current = 0;
public IntIterator(int to) => _to = to;
public bool HasNext() => _current < _to;
public int Next() => HasNext() ? _current++ : 0;
}

var itor = new IntIterator(10);
itor.Next()

C#接口(interface)现在可以有默认方法了。与特征相比,C# 缺少什么?

或者应该有一个更好的 Scala 例子来展示 trait 的力量?

最佳答案

特别是与 Scala traits 比较(不同语言的 traits 可能有很大不同),C# 缺少:

  1. 初始化代码:你可以有

    trait A {
    println("A's constructor")
    }

    并且此代码将在任何继承自 A 的类的构造函数中执行(以正确的顺序)。或者更简单

    trait A {
    val x = 10
    }
  2. Trait linearization (至少在具体细节上)

  3. 不同的 base(在 C# 中)/super(在 Scala 中)分辨率,这意味着 Stackable Trait模式不适用于 C# 接口(interface)。

  4. (在 Scala 3 中出现)Constructor parameters

  5. (在 Scala 3 中删除)Early definitions

关于具有默认方法与特征的 C# 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59547812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com