2012-01-30 5 views
2

에서 클래스 get 함수에서 반환.나는 다음과 같은 상황을위한 좋은 해결책을 찾기 위해 노력하고 matlab에

struct.x(5) 

을 아니면 내가 항상이

myClassObj = SomeClass(); 
x = myClassObj.getX(); 
x(5) 

을? : 좋아한다 또는 일부 FUNC를 작성해야합니까 : 내가 구조체에 그것을 만들 것 같은 배열의 일부 요소를 해결할 수있는 가능성이 있나요 getXAt?

+0

왜 'private'속성이지만 getX()가 정의되어 있습니까? 'x '를 읽을 수있게하고 싶지만 다른 클래스에서는 쓸 수 없게하고 싶습니까? 그리고이 클래스의 모든 속성은 같은 크기의 배열입니까? –

+0

Java로 프로그래밍 할 때 사용했기 때문에 이런 식으로 할 수있는 좋은 방법이라고 확신하지 못했습니다. – Lex

답변

2

있음. Matlab 객체의 속성에 대한 일반적인 동작은 이와 유사합니다. 읽기 전용 속성을 완전히 노출하는 대신 노출시킬 수 있습니다 (private).

classdef SomeClass < handle 

    properties (SetAccess=private) 
     x 
    end 

    methods 
     function obj = SomeClass(x) 
      obj.x = x; 
     end 
    end 
end 

그런 다음 구조체의 필드처럼 처리 할 수 ​​있습니다.

>> sc = SomeClass(1:7); 
>> sc.x(5) 
ans = 
    5 
>> 

Java에서와 같이 항상 자신 만의 접근 기능을 만들 필요는 없습니다. 속성을 사용하여 속성의 읽기 및 쓰기 액세스를 독립적으로 제어 할 수 있습니다. 보다 복잡한 속성 액세스 논리를 원할 경우 function out = get.x(obj) 특수 구문을 사용하여 getter 및 setter를 정의 할 수 있으며 해당 동작은 obj.x 구문을 사용하여 속성 액세스에 적용됩니다.

+0

감사합니다. 나는 그것에 대해 생각하고 있었지만 확실하지 않았습니다. – Lex

1

Matlab에서 모든 클래스는 배열 클래스입니다.

따라서이 방법으로 클래스를 작성할 수 있습니다 :이 같은

classdef SomeClass < handle 

    properties (Access = private) 
     x 
    end 

    methods (Access=public)   
     function this = SomeClass(x) 
      this.x = x; 
     end 
    end 

    methods 
     function x = getX(this)     
      x = [this.x]; 
     end 
    end 
end 

그리고 액세스 :

의 (1) = SomeClass (1);
s (2) = SomeClass (5);
s (3) = SomeClass (6);

s.getX()

ANS =

1  5  6 

S (2) .getX()

의 ANS =

5 
+0

"vectorized"라고하는 것은 잘못된 것입니다. 데이터 요소를 객체 요소로 나누면 실제로 값 비싼 배열 재구성없이 필드에서 벡터화 된 연산을 수행 할 수 없습니다. 올바른 디자인 일지 모르지만 "벡터화 된"것은 아마도 잘못된 용어 일 것입니다.이전 버전의 Matlab doco는 이것을 "평면 구성"클래스가 아니라 "구조화 된"클래스라고 불렀습니다. –

+0

@AndrewJanke, 좋은 지적입니다! –

+0

@Andrey, 팁 주셔서 감사. 나는 그것을 몰랐다. 하지만 제 상황에서는 완벽한 방법이 아니라고 생각합니다. 왜냐하면 x가 제 경우에는 꽤 클 수 있고 거대한 오브제가 필요하기 때문입니다. – Lex

관련 문제