Object Oriented Programming Advanced Usage – Arma Reforger

From Bohemia Interactive Community
Jump to navigation Jump to search
(Add private access to modded classes)
(Missing override in modded example)
 
(3 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{TOC|side}}
{{TOC|side}}
{{Feature|informative|This guideline requires the understanding of [[Arma Reforger:Object Oriented Programming Basics|Object Oriented Programming Basics]].}}
{{Feature|informative|This guideline requires the understanding of {{Link|Arma Reforger:Object Oriented Programming Basics}}.}}




Line 23: Line 23:
Animal animal = cocker; // OK, as a cocker is an animal
Animal animal = cocker; // OK, as a cocker is an animal
string sentence = cocker; // error: cocker does -not- inherit from string
string sentence = cocker; // error: cocker does -not- inherit from string
};
}
</enforce>
</enforce>


Line 35: Line 35:
Cocker cocker2 = Cocker.Cast(dog); // OK: manual casting tells the code "the developer knows what he is doing"
Cocker cocker2 = Cocker.Cast(dog); // OK: manual casting tells the code "the developer knows what he is doing"
// if 'dog' is not castable as a Cocker, null is returned - the code does not crash
// if 'dog' is not castable as a Cocker, null is returned - the code does not crash
Cocker cocker3;
cocker3.Cast(dog); // alternative method
}
}
</enforce>
</enforce>
Line 84: Line 81:
Print(m_data);
Print(m_data);
}
}
};
}
</enforce>
</enforce>


Line 93: Line 90:
Item<int> intItem = new Item<int>(72); // template class Item declared with type "int". In Item<int> class, all Ts are substituted with 'int'
Item<int> intItem = new Item<int>(72); // template class Item declared with type "int". In Item<int> class, all Ts are substituted with 'int'


stringItem.PrintData(); // prints "m_data = 'Hello!'"
stringItem.PrintData(); // prints "m_data = 'Hello!'"
intItem.PrintData(); // prints "m_data = 72"
intItem.PrintData(); // prints "m_data = 72"
}
}
Line 102: Line 99:


A mod can inherit/replace an existing class with the use of the {{hl|modded}} keyword.<br>
A mod can inherit/replace an existing class with the use of the {{hl|modded}} keyword.<br>
It is used to inject inherited class into class hierarchy without modifying other scripts (especially suitable in modding). A modded class behaves like a class inherited from the original class (one can use {{hl|[[Arma Reforger:Object Oriented Programming Basics#super|super]]}} to access the original class) but also allows '''{{hl|private}}''' methods and functions access and modification. When a modded class is declared, the modded class will be instanced instead of the original class. Only classes within the same module can be modded (to mod a class in e.g {{hl|GameLib}} module, the modded class has to be placed in the {{hl|GameLib}} module).
It is used to inject inherited class into class hierarchy without modifying other scripts (especially suitable in modding).
A modded class behaves like a class inherited from the original class (one can use {{hl|[[Arma Reforger:Object Oriented Programming Basics#super|super]]}} to access the original class) but also allows '''{{hl|private}}''' methods and functions access and modification.
When a modded class is declared, the modded class will be instanced instead of the original class.
{{Feature|important|Only classes within the same module can be modded (to mod a class in e.g {{hl|GameLib}} module, the modded class has to be placed in the {{hl|GameLib}} module).}}


<enforce>
<enforce>
Line 115: Line 115:
Print(m_sPrivateString);
Print(m_sPrivateString);
}
}
};
}
   
   
void Test()
void Test()
Line 126: Line 126:
modded class A // this class automatically inherits from the original class A
modded class A // this class automatically inherits from the original class A
{
{
void Say()
override void Say()
{
{
m_sPrivateString = "modded said";
m_sPrivateString = "modded said";
Line 132: Line 132:
super.Say();
super.Say();
}
}
};
}
   
   
void TestModded()
void TestModded()

Latest revision as of 08:16, 8 April 2024

This guideline requires the understanding of Object Oriented Programming Basics.


Casting

Casting is the act of "presenting" a value as another type. For example, if a class hierarchy is Animal > Dog > Cocker, a dog is an animal, a cocker is a dog (that is an animal), but a dog is not especially a cocker.

class Animal {} class Dog : Animal {} class Cocker : Dog {} class Labrador : Dog {}

Upcasting

Upcasting means seeing the class as one of its parents:

void Method() { Cocker cocker = new Cocker(); Animal animal = cocker; // OK, as a cocker is an animal string sentence = cocker; // error: cocker does -not- inherit from string }

Downcasting

Downcasting means seeing a parent class as a specific child - this must be done by manually casting:

void Method(Dog dog) { Cocker cocker1 = dog; // error: "Dog" is too generic to be casted as Cocker - it could be e.g a Labrador Cocker cocker2 = Cocker.Cast(dog); // OK: manual casting tells the code "the developer knows what he is doing" // if 'dog' is not castable as a Cocker, null is returned - the code does not crash }

Manual Casting

void Method() { float value1 = 4.9; int value2 = value1; // value2 = 4 as integer casting -truncates- the value, not rounds it string value3 = "result = " + (bool)value2; // "result = true", as a non-zero integer is true when casted to bool }


Template

A template is a class that allows a generic management for multiple types. Its methods cannot assume anything about the type.

The generic type is by convention declared by the T letter.

// template class Item with generic type T class Item<Class T> { protected T m_data; void Item(T data) { m_data = data; } void SetData(T data) { m_data = data; } T GetData() { return m_data; } void PrintData() { Print(m_data); } }

void Method() { Item<string> stringItem = new Item<string>("Hello!"); // template class Item declared with type "string". In Item<string> class, all Ts are substituted with 'string' Item<int> intItem = new Item<int>(72); // template class Item declared with type "int". In Item<int> class, all Ts are substituted with 'int' stringItem.PrintData(); // prints "m_data = 'Hello!'" intItem.PrintData(); // prints "m_data = 72" }


Modding

A mod can inherit/replace an existing class with the use of the modded keyword.
It is used to inject inherited class into class hierarchy without modifying other scripts (especially suitable in modding). A modded class behaves like a class inherited from the original class (one can use super to access the original class) but also allows private methods and functions access and modification. When a modded class is declared, the modded class will be instanced instead of the original class.

Only classes within the same module can be modded (to mod a class in e.g GameLib module, the modded class has to be placed in the GameLib module).

// game class A { private string m_sPrivateString = "something said"; void Say() { Print("original Say method"); Print(m_sPrivateString); } } void Test() { A a = new A(); // "class A" is instanced a.Say(); // prints "original Say method" then "something said" } // mod modded class A // this class automatically inherits from the original class A { override void Say() { m_sPrivateString = "modded said"; Print("modded Say method"); super.Say(); } } void TestModded() { A a = new A(); // "modded class A" is instanced a.Say(); // prints "modded Say method" then "original Say method" and "modded said" }