











本文是「far 语言」系列文档之一,总目录见《【far 语言】语言文档目录》。
Far v2 类型系统:强类型 + 泛型(编译期擦除)+ 接口 + 单继承。组合与继承并存,组合仍是默认倾向。
interface Runnable {
long run(long x);
string describe();
}
impl 声明所实现的接口,方法签名须覆盖接口全部方法;漏写或签名不符都会编译报错。interface IError { }
class MyError impl IError { }
class MyError impl IError, ILoggable { }interface IChild : IParentA, IParentB { }接口方法只有签名,不能写方法体(far 没有 Java 的 default method)。写了会编译报错并指向 { 的位置:
interface Greeter {
string hello(); // ✅ 正确
// string hi(){ ... } // ❌ 接口方法不能有方法体(far 不支持默认方法)
}
实现类的实现必须写在类里:
interface Greeter { string hello(); }
class Dog impl Greeter {
string hello(){ return "woof"; } // 实现在类里
}
被 impl 接口的父接口自动被满足 —— 与 Java 的 interface extends 语义一致:
interface Named { string name(); }
interface Aged : Named { long age(); }
class Dog impl Aged {
string name(){ return "dog"; }
long age(){ return 3; }
}
Named n = new Dog(); // ✅ Dog impl Aged,而 Aged : Named ⇒ Dog 天然满足 Named
Aged a = new Dog(); // ✅
Named n2 = a; // ✅ 接口 → 父接口,同样成立
注意实现类仍需实现继承链上的全部方法(上例 Dog 同时实现了 name() 与 age())。
接口内可声明同名、参数个数不同的方法,调用按实参个数解析:
interface Greeter {
string greet(string who);
string greet();
}
class Dog impl Greeter {
string greet(string who){ return "hi " + who; }
string greet(){ return "hi"; }
}
Greeter g = new Dog();
g.greet("mike"); // hi mike
g.greet(); // hi
类只允许单继承,语法用冒号;多能力请走 impl 接口列表:
class Animal {
long hp = 100;
string speak(){ return "animal"; }
}
class Dog : Animal impl Runnable {
@Override
string speak(){ return super.speak() + "+woof"; }
}
class 子类 : 父类 impl 接口1, 接口2 { }super.method() 显式调用父类实现;@Override 断言真覆盖,签名写错立刻报错。class Box<T> {
T val;
T get(){ return this.val; }
void set(T v){ this.val = v; }
}
Box<long> b = new Box();
b.set(42);
println(b.get()); // 42
Box<long> 与 Box 生成相同代码,零开销。class NumberBox<T extends Number> {}
<T extends Runnable> void run(T r) {}
<T extends Bound> 上界,不满足编译报错。List<long> nums = new List(); // 见 list.md
map<string, long> m = {"alice": 30}; // 见 map.md
两者不是互斥替代关系,按场景选:
// ① 组合:拥有关系 / 想避免继承耦合(默认倾向)
class Animal {
long hp;
}
class Dog {
Animal animal = new Animal(); // 组合:拥有一个 Animal
long hp(){ return this.animal.hp; } // 转发
}
// ② 继承:明确的 IS-A 关系 + 需要多态分派(只允许单继承)
class Cat : Animal {
long lives = 9;
}
inherit 关键字不使用;继承语法是冒号 class 子类 : 父类 { }。
Rust编程语言群 1036955113
java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
大数据 elasticsearch 群 481975850
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。