2014-10-24 3 views
0

Я расширяю абстрактный класс из библиотеки, и я хочу переопределить определение функции и использовать определение суперкласса в качестве резервной копии.Лучший способ переопределить определение функции

Если метод родительского класса был определен как PartialFunction, я мог бы просто использовать orElse. Так как это не так, я делаю следующее: отбрасывая родительскую функцию в частичную функцию, чтобы я мог использовать orElse. Это работает, но это один из тех случаев, когда я подозреваю, что есть лучший/более элегантный способ. Здесь?

abstract class ThingICantChange { 
    def test:Int=>String = { 
     case 1 => "one" 
     case 2 => "two" 
     case _ => "unknown" 
    } 
} 

class MyClass extends ThingICantChange { 
    def myChanges:PartialFunction[Int,String] = { 
    case 2 => "mytwo" 
    case 3 => "three" 
    } 
    override def test = myChanges orElse Function.unlift(x => Some(super.test(x))) 
} 

ответ

3

Я хотел бы сделать это:

class MyClass extends ThingICantChange { 
    override def test: Int => String = { 
    case 2 => "mytwo" 
    case 3 => "three" 
    case x => super.test(x) 
    } 
} 

Если вы хотите, чтобы построить частичную функцию от super.test то здесь чистый способ:

override def test = myChanges orElse PartialFunction(super.test) 
+0

Да ... Я должен иметь уточняется: мой код более сложный, чем этот (очевидно), и я хотел бы иметь возможность составлять несколько частичных функций с помощью orElse. Я мог бы просто сделать по умолчанию 'def last: PartialFunction [Int, String] = {case x => super.test (x)}' и использовать это как final orElse, но это не похоже на то, что я сделал. У меня просто было ощущение, что есть эквивалент моей 'Function.unlift (x => Some (super.test (x))) глупости, которую я еще не изучил. – brandon

+0

Обновлен мой ответ, чтобы отразить вашу цель. – Nate

+0

Видите ли, я знал, что должен быть более простой способ! Не могу поверить, что я об этом не думал. Благодарю. – brandon

Смежные вопросы