Я не могу определить статический метод в интерфейсе, поскольку реализация зависит от конкретного класса. Кроме того, я не могу просто притворяться, что мои классы будут иметь метод статического создания, потому что я хочу вызывать этот метод рекурсивно, как в следующем примере Rust.
Я могу сделать это в Ржавчина:
Код: Выделить всё
fn main() {
Double::zero().print();
Complex::::zero().print();
Dual::::zero().print();
Dual::::zero().print();
Complex::::zero().print();
}
trait SetElement
{
fn to_string( &self ) -> String;
fn print( &self )
{
println!( "{}" , self.to_string() );
}
}
trait AdditiveUnitalMagma: SetElement
{
fn zero() -> T;
}
struct Double
{
x: f64,
}
impl SetElement for Double
{
fn to_string( &self ) -> String
{
self.x.to_string()
}
}
impl AdditiveUnitalMagma for Double
{
fn zero() -> Double
{
Double{ x: 0.0 }
}
}
struct Complex
{
x: T,
y: T,
}
impl SetElement for Complex
{
fn to_string( &self ) -> String
{
"(".to_owned() + &self.x.to_string() + ") + i (" + &self.y.to_string() + ")"
}
}
impl AdditiveUnitalMagma for Complex
{
fn zero() -> Complex
{
Complex{ x: T::zero() , y: T::zero() }
}
}
struct Dual
{
a: T,
b: T,
}
impl SetElement for Dual
{
fn to_string( &self ) -> String
{
"(".to_owned() + &self.a.to_string() + ") + epsilon (" + &self.b.to_string() + ")"
}
}
impl AdditiveUnitalMagma for Dual
{
fn zero() -> Dual
{
Dual{ a: T::zero() , b: T::zero() }
}
}
Код: Выделить всё
public static void main(String[] args) {
Double.zero().print();
Complex.zero().print();
Dual.zero().print();
Dual.zero().print();
Complex.zero().print();
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... plement-th