Помогите разобраться с интерфейсами и классами (начинающему)

Devillio
Дата: 23.10.2019 14:59:33
Доброго времени суток!!

Если не трудно, подскажите где мои ошибки? Чую их прям дофига :)
Не использовал никогда интерфейсы, захотелось поэкспериментировать, решил учиться на реальной задаче.
Нужен расчет стоимости маш.-часа. В него входит несколько параметров, нужно выдавать пользователю формулу и значение каждого параметра.
+ Соответственно, наваял вот такой интерфейс и "общий" класс для всех параметров
type
  IMashParameter = interface
    // общие методы
    function GetRubValue: Currency;
    procedure SetRubValue(const RubValue: Currency);
    function GetFormula: String;
    procedure SetFormula(const Formula: String);
    // переопределяемые
    procedure ConstructFormula;
    procedure DrawParamVals;
    // общие свойства
    property RubValue: Currency read GetRubValue write SetRubValue;
    property Formula: String read GetFormula write SetFormula;
  end;

type
  TCommonParameter = class(TInterfacedObject, IMashParameter)
  private
    function GetRubValue: Currency;
    procedure SetRubValue(const RubValue: Currency);
    function GetFormula: String;
    procedure SetFormula(const Formula: String);
  public
    procedure ConstructFormula;
    procedure DrawParamVals;
    property RubValue: Currency read GetRubValue write SetRubValue;
    property Formula: String read GetFormula write SetFormula;
  end;
Сами параметры описал как наследника TCommonParameter
+ Типа вот так
type
  TMashAmortiz = class(TCommonParameter)
    AmortID: Integer;
    AmortNorma: Double;
    procedure ConstructFormula;
    procedure DrawParamVals;
  end;

type
  TMashGRR = class(TCommonParameter)
    GRR: Integer;
    GRRTempKoeff: Double;
    procedure ConstructFormula;
    procedure DrawParamVals;
  end;
+ Создал класс, который собирает в себе все параметры
type
  TMashSmetData = class(TPersistent)
    public
    VosstFormula: String;
    GRRInfo: TMashGRR;
    AmortInfo: TMashAmortiz;
+ И затем использую это все
type
  TMashCalculation = class
  private
...
    FMashSmetData: TMashSmetData;
    procedure FSetMashSmetData(AMashSmetData: TMashSmetData);
  public
    property PriceSmetData: TMashSmetData read FMashSmetData write FSetMashSmetData; 
  end;

И вот теперь как мне значения то менять?
Напрямую естественно (Типа MashCalculation.PriceSmetData.GRRInfo.Formula) писать не дает.
Делаю в тестовой процедуре временный TMashSmetData:
var
  MSD: TMashSmetData;
begin
...
//при исполнении вываливается что нельзя так присвоить, причем тип указывает в ошибке вообще не этот
        MashCalculation.PriceSmetData.AssignTo(MSD); 


Если не затруднит, укажите на ошибки?
Спасибо!
ёёёёё
Дата: 23.10.2019 15:00:20
Ошибок нет, код идеален.
Devillio
Дата: 23.10.2019 15:14:58
ёёёёё, не работает же )

Если property класса сам есть класс, как правильно в него писать значения?
Понятно, его надо создать сначала. А потом как?
Как с record (сделать сначала временный, и затем присвоить), не получается, при assign выдает вот такой текст (причем там TcxCustom... я вообще не понимаю):
Barmaley57
Дата: 23.10.2019 15:18:32
Devillio, экземпляры создаешь? А то похоже на мусор в памяти...
p.s. virtual, override точно не нужно использовать при наследовании?
Barmaley57
Дата: 23.10.2019 15:19:45
И зачем вообще интерфейсы?