그래서 저는 몇몇 모델을 가지고 놀았으며 클래스 메소드의 상속을 서브 클래스별로 제한하고자하는 상황에 처했습니다. 문제는, 나의 실험은 지금까지 할 수 없다는 나의 이해를 확인해 주었다. 이 슈퍼 클래스의, 서브 클래스는 방법이 없기 때문에 작동하지 않습니다 물론루비 : 선택적 클래스 상속?
class Policy
class << self
def lookup(object)
#returns a subclass by analyzing the given object, following a naming convention
end
def inherited(sub)
sub.class_eval { remove_method :lookup }
end
end
end
:
나는 순진하게도 다음과 같은 시도했다. 그 후 나는 시도 : 는 슈퍼 클래스 떨어져 서브 클래스가로드 처음 방법을 취함으로써 작동 작은 세부 사항을 제외하고, 하하, 마치 마법처럼 작동def inherited(sub)
class << Policy
remove_method :lookup
end
end
. 죄송합니다.
그래서 Ruby가 메소드를 찾는 방식으로 인해 이것이 작동하지 않을 것이라고 확신합니다.
내가 관심을 갖는 이유는 내가 작업하고있는 작업에서 이름 지정 규칙에 따라 여러 가지 정책을 적용 할 수 있었기 때문에 정책에 대한 참조를 얻을 수있는 좋은 방법이 있습니다. 다른 어떤 종류의 물체에 대해서. 나에게, syntatically,이 작업을 수행하는 것이 좋은 것 같다
class RecordPolicy < Policy
# sets policy concerning records,
# inherits common policy behavior from Policy
end
class Record
end
$> record = Record.new
=> #<Record:0x0000>
$> Policy.lookup(record)
=> RecordPolicy
그러나, 나는 그것이 RecordPolicy#lookup
를 호출 할 수 어떤 의미가 있다고 생각하지 않습니다. 당신은 정책을 가지고 있습니다. 찾을 것이 아무것도 없습니다.
1) 사실, 거기에 선택적으로 루비에서 상속 할 수있는 클래스 방법을 정의하는 몇 가지 방법 :
그래서, 내 질문은 두 부분입니까?
2) 어디 선가 주어진 객체 에 대한 정책 이름을 추론하기위한 로직을 캡슐화 할 점을 감안하고,이 시점에서
나는 때문에, 그 대답이 '아니오'거의 확실 해요 그것은 내가 지금까지 시도한 것이 Policy 클래스가 틀림 없음을 증명하는 것처럼 보입니다. 장소, 대신이 종류의 것을 넣으시겠습니까?감사합니다. 부분 모두에서 2. 매우 유용한 통찰력을 응답하는 1 부와 Linuxios 응답에 대한 JimLim에
업데이트
감사합니다.
FWIW는 Linuxios 말한 반영 후, 여기에 내가하기로 결정 무엇 :이 같은 느낌
class << self
def lookup(record)
if self.superclass == Policy
raise "No default naming convention exists for subclasses of Policy. Override self.lookup if you want to use it in a subclass."
else
# naming convention lookup goes here
end
end
end
이 코드가 사용되는 방법에 대한 가장 놀라운 것입니다. 누군가가 서브 클래스에 #lookup 메소드를 제공해야하는 이유가 있다면, 서브 클래스를 설정할 수는 있지만, 상속 된 서브 클래스를 호출하면 서브 클래스에 예외가 있다는 것을 알게된다.
둘 다 내 질문에 대답 한 "답"을 얻는 방법을 결정하는 것과 관련하여 "동점"의 경우 개인 습관은 평판이 낮은 사람의 답변을 수락하는 것이 었습니다. 시간.
도움 주셔서 감사합니다.
아무것도하지 않고 예외를 발생시키는 서브 클래스에서'lookup' 메소드를 정의하는 것이 좋은 생각일까요? –
undef_method가 적용될 수 있습니다. –
@JimLim 그게 현실적인 대안으로 나를 때렸지 만, 다른 사람들이 하위 클래스를 만들 것이라는 생각이 들었습니다. 나는 오히려 한 가지 방법이 상속받을 때 단순히 존재하지 않는다는 관점에서 오히려 그 것이 었습니다. 아래 답변에 몇 가지 옵션이있는 것 같습니다. – Andrew