オブジェクト指å‘: プロパティ・メソッド

プロパティ

アクセサ

メンãƒå¤‰æ•°(インスタンス変数)ã«å¤–部ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã™ã¤ç‚ºã®ãƒ¡ã‚½ãƒƒãƒ‰
get(set)アクセサã€getter(setter)ã¨å‘¼ã°ã‚Œã‚‹ã€‚

private class clsParent{
 private int _member1;
 public int member1
 {
  //getアクセサ
  get { return this._member1; }
  //setアクセサ
  valueã¯å®£è¨€ä¸è¦
  set { _member1 = value; }
 }

 //↑ã®çœç•¥å½¢
 public int member2 { get; set; }

 public void SubRoutin1(){
  ~
 }
}

public void main()
{
 clsParent myParent = new clsParent();
 myParent.member1 = 5;
 int x = myParent.member1;

 myParent.member2 = 10;
 int y = myParent.member2;

 myParent.SubRoutin1();
}

class MyClass
{
private:
  int _member;
public:
  int GetMember();
  void SetMember(int member);
};

int MyClass::GetMember()
{
  return this->_member;
}

void MyClass::SetMember(int member)
{
  this->_member = member;
}

int main(array<System::String ^> ^args)
{
  MyClass *myClass = new MyClass();
  myClass->SetMember(10);
  Console::WriteLine(myClass->GetMember());
  // →10
  delete myClass;
  
return 0;
}

※Getter/Setterã‚’åŒåã§ã‚ªãƒ¼ãƒãƒ¼ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ã¨å‘¼ã³å‡ºã—å´ã‹ã‚‰ã¯ä½¿ã„ã‚„ã™ããªã‚‹ã€‚
「オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰ã€å‚ç…§

Private Class clsTest()
 Dim _Menber As Integer
 
 Public Property Menber As Integer
  ‘getアクセサ
  Get
   Return _Member
  End Get
  ‘setアクセサ
  Set(ByVal prm As String)
   _Member = prm
  End Set
 End Property
 
 Public Sub SubRoutine()
  ~
 End Sub
End Class

Dim myTest As New clsTest()
myTest.Member = 10
Dim x As Integer = myTest.Member
Call myTest.SubRoutine()

クラスモジュール
※MyClass.cls

Dim pMyVal As Integer
Dim pMyObj As Object

‘å‚ç…§(読ã¿å–り)専用:データ型
Public Property Get Getter() As Integer
  Getter = pMyVal
End Property

‘å‚ç…§(読ã¿å–り)専用:オブジェクト型
Public Property Get Getter() As Object
  Set Getter = pMyVal
End Property

‘設定(書ãè¾¼ã¿)専用:データ型
Public Property Let Letter(ByVal prm As Integer)
  pMyVal = prm
  ※正確ã«ã¯â†“ ã®æ§˜ã«æ›¸ããŒã€ŒLetã€ã¯çœç•¥å¯èƒ½ã€‚
  Let pMyVal = prm
End Property

‘設定(書ãè¾¼ã¿)専用:オブジェクト型
Public Property Set Setter(ByVal prm As Object)
  Set pMyObj = prm
End Property

‘イニシャライザー
Private Sub Class_Initialize()
  Call MsgBox("Initialize()")
End Sub

‘ファイナライザー
Private Sub Class_Terminate()
  Call MsgBox("Terminate()")
End Sub

※呼ã³å‡ºã—å…ƒ
Private Sub Form_Load()

  Dim myClass As myClass
  Set myClass = New myClass
  
  myClass.Letter = 5
  Let myClass.Letter = 5
  
  Dim myObj As Object
  Set myClass.Setter = myObj
  
  Debug.Print (myClass.Getter)
  
  Set myClass = Nothing

End Sub

private class clsParent{
 private int _member1;
 public int member1
 {
  //getter
  get { return this._member1; }
  //setter
  valueã¯å®£è¨€ä¸è¦
  set { _member1 = value; }
 }

 public void SubRoutin1(){
  ~
 }
}

public void main()
{
 clsParent myParent = new clsParent();
 myParent.member1 = 5;
 int x = myParent.member1;

 myParent.member2 = 10;
 int y = myParent.member2;

 myParent.SubRoutin1();
}

function Calc1(prm1, prm2){
 this.member1 = prm1;
 this.member2 = prm2;
}
var number = new Calc1(1, 2);
var x = number.member1 + number.member2;
⇒ x : 3

number.member1 = 10;
number.member2 = 20;
var y = number.member1 + number.member2;
⇒ x : 30

var Calc2 = function(prm1, prm2){
 this.member1 = prm1;
 this.member2 = prm2;
};

var number = new Calc2(100, 200);
var x = number.member1 + number.member2;
⇒ x : 300

number.member1 = 1000;
number.number2 = 2000;
var y = number.member1 + number.member2;
⇒ y : 3000

$p = new MyClass();

$p->SetMyVal("aaa");
$val = $p->GetMyVal
$val:aaa

class MyClass{
 private $_myVal;
 
 function SetMyVal($prm)
 {
  $this->_myVal = $prm;
 }
 function GetMyVal()
 {
  return $this->_myVal;
 }
}

読ã¿å–り・書ãè¾¼ã¿å°‚用属性

//フィールドをprivate属性ã«ã—ã€ã‚¢ã‚¯ã‚»ã‚µã‚’読ã¿å–り用ã—ã‹å®šç¾©ã—ãªã„。
int _member;
public int member{ get; }

int _member;
public int member{ set;}

宣言時ã€ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ã§ã®ã¿è¨­å®šå¯èƒ½ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹å¤‰æ•°
(固定値(const)ã¨é•ã„ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹æ¯Žã«å€¤ã‚’変ãˆã‚‰ã‚Œã‚‹)
public class Test
{
  private readonly int member = 5;
  public Test(int init)
  {
    this.member = init;
  }
  
  public int Member
  {
    get { return this.member; }
    ⇒ OK
    set { this.member = value; }
    ⇒ ビルドエラー
  }
}

 Dim _Menber As Integer
 Public ReadOnly Property Menber As Integer
  Get
   Return _Member
  End Get
 End Property
 
 Dim _Menber As Integer
 Public WriteOnly Property Menber As Integer
  Set(ByVal prm As String)
   _Member = prm
  End Set
 End Property

インデクサ

※インスタンス自身をプロパティã¨ã—ã¦æ‰±ã†

using System.Collections.Generic;
public class MyList<T>
{
  T[] _list = new T[1000];
  public T this[int index]
  {
    get { return _list[index]; }
    set { _list[index] = value; }
  }
}

public void Form1_Load(object sender, EventArgs e)
{
  MyList<int> myList = new MyList<int>();
  
  for (var i = 0; i < 10; i++)
  {
    myList[i] = i;
    ※インスタンスをプロパティã¨ã—ã¦æ‰±ã£ã¦ã„ã‚‹
  }
}

Imports System.Collections.Generic
Public Class MyList(Of T)
  Dim _list(1000) As T
  
  //デフォルトã®ãƒ—ロパティを宣言
  Default Public Property list(ByVal index As Integer) As T
    Get
      Return _list(index)
    End Get
    Set(value As T)
      _list(index) = value
    End Set
  End Property
  
End Class

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  
  Dim myList As New MyList(Of Integer)
  
  For i As Integer = 0 To 10 Step 1
    myList(i) = i
    ※インスタンスをプロパティã¨ã—ã¦æ‰±ã£ã¦ã„ã‚‹
  Next i
  
End Sub

メソッド

クラス内サブルーãƒãƒ³
public宣言ã™ã‚‹äº‹ã§ã‚¯ãƒ©ã‚¹å¤–部ã‹ã‚‰å‘¼ã°ã›ã‚‹äº‹ãŒå¯èƒ½ã€‚

public class Parent
{
 private int member;
 public void SubRoutine(int prm1, int prm2)
 { this.member = prm1 + prm2; }
}

public void main()
{
  Parent p = new Parent();
  p.SubRoutine(prm1:5, prm2:10);
}

// インライン定義
class MyClass
{
private:
  int ~;
public:
  void sayMember(){
    ~
  }
};

// 外部宣言
class MyClass
{
private:
  int ~;
public:
  // プロトタイプ宣言
  void sayMember();
};

void MyClass::sayMember()
{
  ~;
}

int main(array<System::String ^> ^args)
{
  インスタンスをスタック領域ã«ä½œæˆ
  MyClass myClass
  myClass.sayMember();
  
  インスタンスをヒープ領域ã«ä½œæˆ
  MyClass *myClass = new MyClass();
  myClass->sayMember();
  delete myClass
  
  return 0;
}

※スタック領域/ヒープ領域ã«ã¤ã„ã¦ã¯ã€ã€Œãƒ¡ãƒ¢ãƒªç®¡ç†/ヒープ領域ã€å‚ç…§

Public Class Parent
 Private member As Integer
 Public Sub SubRoutine(
   ByVal prm1 As Integer, _
   ByVal prm2 As Integer)
   me.member = prm1 + prm2
 End Sub
End Class

Public Sub Main()
  Dim p As New Parent()
  p.SubRoutine(prm1:=5, prm2:=10)
End Sub

C#ã¨åŒã˜
var Parent = function(){
  this.answer;
  this.add = function(prm1, prm2){
    this.answer = prm1 + prm2;
  };
};
$p = new MyClass();

$p->Method();
aaa

class MyClass{
 function Method(){
  print("aaa");
 }
}

オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰

多é‡å®šç¾©
引数・戻り値ã®ç•°ãªã‚‹åŒåã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’定義ã™ã‚‹äº‹ã€‚
ä¼¼ãŸæ©Ÿèƒ½ã‚’åŒåã«ã™ã‚‹äº‹ã§ç›´æ„Ÿçš„ã«ä½¿ã„ã‚„ã™ããªã‚‹ã€‚
設計時ã«ã¯åå‰è¡çªã‚‚èµ·ã“り難ã„。

private class Parent
{
 public int member{ get; set; }
 
 public void SubRoutine(int prm1, int prm2)
 { this.member = prm1 + prm2; }
 
 //オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰(引数ãŒé•ã†)
 public void SubRoutine()
 { Console.WriteLine(this.member); }
 
 //オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰(戻り値ãŒé•ã†)
 ※引数も変ãˆã‚‹å¿…è¦ã‚り
 public int SubRoutine(int prm1, int prm2, int prm3)
 {
  return prm1 + prm2 + prm3;
 }
}
※C++ã¯ã‚¯ãƒ©ã‚¹å†…ã«é™ã‚‰ãšé€šå¸¸ãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚‚オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰å¯èƒ½

※Getter/Setterã‚’åŒåã§ã‚ªãƒ¼ãƒãƒ¼ãƒ­ãƒ¼ãƒ‰ã—ãŸä¾‹
class MyClass
{
private:
  int _member;
public:
  int Member();
  void Member(int member);
};

int MyClass::Member()
{
  return this->_member;
}

void MyClass::Member(int member)
{
  this->_member = member;
}

int main(array<System::String ^> ^args)
{
  MyClass *myClass = new MyClass();
  myClass->Member(10);
  Console::WriteLine(myClass->Member());
  // →10
  delete myClass;

  return 0;
}

Public Class Parent
 Private member As Integer
 Public Sub SubRoutine(
   ByVal prm1 As Integer, _
   ByVal prm2 As Integer)
   me.member = prm1 + prm2
 End Sub
 
 ’オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰(引数ãŒé•ã†)
 Public Overloads Sub SubRoutine()
  Console.WriteLine(me.member)
 End Sub
 
 ’オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰(引数ãŒé•ã†)
 ※引数も変ãˆã‚‹å¿…è¦ã‚り
 Public Overloads Function SubRoutine(
   ByVal prm1 As Integer, _
   ByVal prm2 As Integer, _
   ByVal prm3 As Integer) As Integer
  Return prm1 + prm2 + prm3
 End Sub
End Class
private class Parent
{
 private int member;
 
 public void SubRoutine(int prm1, int prm2)
 { this.member = prm1 + prm2; }
 
 //オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰(引数ãŒé•ã†)
 public void SubRoutine()
 { Console.WriteLine(this.member); }
 
 //オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰(戻り値ãŒé•ã†)
 ※引数も変ãˆã‚‹å¿…è¦ã‚り
 public int SubRoutine(int prm1, int prm2, int prm3)
 {
  return prm1 + prm2 + prm3;
 }
}
var Parent = function(){
  this.answer;
  this.add = function(prm1, prm2){
    this.answer = prm1 + prm2;
  };
};

var Child = function(){};

//継承
Child.prototype = new Parent();
Child.prototype.minus = function(prm){
  this.answer -= prm;
};

var child = new Child();
child.add(1,1);
child.minus(1);
⇒this.answer = 1

演算å­ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ­ãƒ¼ãƒ‰

class MyClass
{
 int x, y;
 
 public MyClass() { x = y = 0; }
 public MyClass(int i, int j) { x = i; y = j; }
 
 public static MyClass operator +(MyClass prm1, MyClass prm2)
 {
  MyClass result = new MyClass();
  
  result.x = prm1.x + prm2.x;
  result.y = prm1.y + prm2.y;
  
  return result;
 }

}

class Program
{
 static void Main(string[] args)
 {

  MyClass a = new MyClass(1, 1);
  MyClass b = new MyClass(10, 10);
  MyClass c = new MyClass();
  c = a + b;
  c.x:11 c.y:11
  +ã¯MyClassã¨MyClassã®å€¤ãŒè¶³ã•れã¦ã„ã‚‹
 }
}

class MyClass
{
 int x, y;
 
 public MyClass() { x = y = 0; }
 public MyClass(int i, int j) { x = i; y = j; }
 
 public static MyClass operator +(MyClass prmObj, int prmInt)
 {
  MyClass result = new MyClass();
  
  result.x = prmObj.x + prmInt;
  result.y = prmObj.y + prmInt;
  
  return result;
 }
}

class Program
{
 static void Main(string[] args)
 {

  MyClass a = new MyClass(1, 1);
  MyClass result = new MyClass();
  
  result = a + 5;
  result.x:6 result.y:6
  +ã¯MyClassã¨intã®å€¤ãŒè¶³ã•れã¦ã„ã‚‹
 }
}

class MyClass
{
private:
 int myInt1;
 int myInt2;
public:
 MyClass(int prm1, int prm2);
 void Show();
 MyClass operator+(MyClass obj);
};

MyClass::MyClass(int prm1 = 0, int prm2 = 0)
{
 this->myInt1 = prm1;
 this->myInt2 = prm2;
};

void MyClass::Show()
{
 cout << "myInt1:" << this->myInt1 << endl;
 cout << "myInt2:" << this->myInt2 << endl;
}

MyClass MyClass::operator+(MyClass obj)
{
 MyClass m;
 m.myInt1 = this->myInt1 + obj.myInt1;
 b.myInt1 + c.myInt2
 m.myInt2 = this->myInt2 + obj.myInt2;
 b.myInt2 + c.myInt2

 return m;
ã€€çµæžœã‚’a.myInt1ã€a.myInt2ã«æ ¼ç´
 インスタンス:mã¯ã“ã“ã§ç ´æ£„ã•れる
}

int _tmain(int argc, _TCHAR* argv[])
{
 MyClass a(0, 0);
 MyClass b(10, 20);
 MyClass c(50, 60);

 a = b + c;
 オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰ã—ãŸ+を利用
 bã®+関数ã¸cを渡ã—ã€çµæžœã‚’aã«æ ¼ç´ã™ã‚‹
 a = b.+(c)

 a.Show();
 →myInt1:60 myInt2:80

 return 0;
}

クラス外ã«ã‚ªãƒ¼ãƒãƒ¼ãƒ­ãƒ¼ãƒ‰æ¼”ç®—å­ã‚’定義
パターン1
class MyClass
{
private:
 int myInt;
public:
 MyClass(int prm){ this->myInt = prm; };
 int Getter(){ return this->myInt; }
};

通常ã®ï¼‹æ¼”ç®—å­ã‚’オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰
MyClass operator+(int prmI, MyClass prmM)
{
 return MyClass(prmI + prmM.Getter());
}

int _tmain(int argc, _TCHAR* argv[])
{

 MyClass a(0);
 MyClass b(100);
 
 a = 1000 + b;
 オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰ï¼‹ã«å¼•æ•°1000ã¨bインスタンスを渡ã—ã€çµæžœã‚’aã«æ ¼ç´
 (ãªãœã‹)左崿•°å€¤ãŒç¬¬ä¸€å¼•æ•°ã€å³å´ã‚ªãƒ–ジェクトãŒç¬¬äºŒå¼•æ•°
 →a.myInt:1100

 return 0;
}

パターン2
MyClass operator+(MyClass m1, MyClass m2)
{
 return MyClass(m1.Getter() + m2.Getter());
}

int _tmain(int argc, _TCHAR* argv[])
{

 MyClass a(0);
 MyClass b(100);
 MyClass c(100);
 
 a = b + c;
 オーãƒãƒ¼ãƒ­ãƒ¼ãƒ‰ï¼‹ã«å¼•数:aインスタンスã¨bインスタンスを渡ã—ã€çµæžœã‚’aã«æ ¼ç´
 (ãªãœã‹)左崿•°å€¤ãŒç¬¬ä¸€å¼•æ•°ã€å³å´ã‚ªãƒ–ジェクトãŒç¬¬äºŒå¼•æ•°
 →a.myInt:200

 
 return 0;
}

メンãƒãƒ¼ã®è¿½åŠ (JS)

//定義済ã¿ã‚¯ãƒ©ã‚¹ã«å¯¾ã—ã¦ãƒ¡ãƒ³ãƒãƒ¼è¿½åŠ 
var MyClass = function(){};

MyClass = function(){
 this.member1;
};
MyClass = function(){
 this.add1 = function(){
  this.member1 += 1;
 };
};

var myclass = new MyClass();
myclass.member1 = 5;
myclass.add1();
// ⇒ myclass.member1 = 6;

//インスタンスã«å¯¾ã—ã¦ãƒ¡ãƒ³ãƒãƒ¼è¿½åŠ 
member.Minus = function(){
 return this.member1 – this.member2;
};
number.Minus();
⇒-1000;

var newMember = new Calc2();
newMember.Minus();
//↑ 未定義エラー

ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ä½œæˆæ™‚ã®ãƒ¡ã‚½ãƒƒãƒ‰ã®ã‚³ãƒ”ー

※プロパティã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹æ¯Žã«ç•°ãªã‚‹å€¤ã‚’æŒãŸã›ã‚‹æ„味ã¯ã‚ã‚‹ãŒã€
 全ãåŒã˜æŒ™å‹•ã‚’ã™ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰ã‚’全インスタンスã«ã‚³ãƒ”ーã™ã‚‹ã®ã¯ãƒ¡ãƒ¢ãƒªã®ç„¡é§„。
 ãã®ç‚ºã€ä¾‹ãˆã°Webシステム用言語JavaScriptã§ã¯prototype等を用ã„ã¦ãƒ¡ã‚½ãƒƒãƒ‰ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¸ã®ã‚³ãƒ”ーをçœç•¥ã™ã‚‹ä»•様をæŒã¤ã€‚
 ã—ã‹ã—C#ã§ã¯ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ã‚³ãƒ”ーã•れãšã€ã‚¯ãƒ©ã‚¹ã‚’å‚ç…§ã™ã‚‹ç‚ºã®ãƒã‚¤ãƒ³ã‚¿ãŒã‚³ãƒ”ーã•れるã®ã¿ã€‚
 クラスã®ã‚³ãƒ”ー(インスタンス作æˆ)ã®éš›ã®ã€ãƒ¡ã‚½ãƒƒãƒ‰ã«é–¢ã™ã‚‹ãƒ¡ãƒ¢ãƒªåˆ¶å¾¡ã‚’考慮ã™ã‚‹å¿…è¦ã¯ãªã„。
※C#ã¨åŒæ§˜ã€‚
//プロトタイプ(インスタンス時ã«ãƒ¡ãƒ¢ãƒªã«ã‚³ãƒ”ーã•れãªã„メンãƒãƒ¼å®šç¾©)
※プロパティã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹æ¯Žã«ç•°ãªã‚‹å€¤ã‚’æŒãŸã›ã‚‹æ„味ã¯ã‚ã‚‹ãŒã€
 全ãåŒã˜æŒ™å‹•ã‚’ã™ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰ã‚’全インスタンスã«ã‚³ãƒ”ーã™ã‚‹ã®ã¯ãƒ¡ãƒ¢ãƒªã®ç„¡é§„。
 ブラウザã®èª­ã¿è¾¼ã¿æ¯Žã«ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’作æˆã™ã‚‹WEBシステムã®ç‰¹æ€§ã‚’考慮ã—ã€
 メソッドã«ã¤ã„ã¦ã¯é€šå¸¸ã€ä»¥ä¸‹ã®æ©Ÿèƒ½ã‚’用ã„ã¦ãƒ¡ãƒ¢ãƒªãƒ¼ã‚³ãƒ”ーを行ã‚ã›ãªã„。

MyClass.prototype.plus10 = function(number){
 this.member1 += 10;
 this.member2 += 10;
}
var myclass = new MyClass()
myclass.plus10()

//プロトタイプ定義ã®åˆ¥ã®æ›¸ãæ–¹
MyClass.prototype = {
 this.plus10 = function(number){
  this.member1 += 10;
  this.member2 += 10;
 }
}

Follow me!