AMcoder - javascript, python, java, html, php, sql

Ինչպես փոխարկել մեկ դասի օբյեկտը մյուսին (որտեղ դասի անդամները տարբեր են)

Ես ունեմ մի սցենար, որտեղ ես ունեմ (objA) (դաս A) և (objB) (դաս B): A և B դասի անդամ փոփոխականները չեն համընկնում: Ես պետք է նշանակեմ տվյալներ objA-ից objB: Ես փնտրեցի շուրջը և գտա լուծումներ, որոնք կապված են objA-ն objB-ի մեջ քարտեզագրելու հետ, որտեղ անդամ փոփոխականները նույնն են: Բայց ես ոչինչ չեմ գտել, երբ A և B դասի անդամները տարբեր են:

Ստորև ներկայացված են 2 նմուշ դասեր (դաս A և B դաս)՝ գաղափար տալու համար:

public class Class A
{
    private ABCHeaderType ABCHeaderField;
    private string title;
    private string date;
    private string id;
    private string location;
    private string status;
    private string hashNumber;      
    .....skipped getter setters     
}   
public class ABCHeaderType { 
    private string version;    
    private string outputTypeField;    
    private int langCd;       
    private string dateTime;    
    private string hashField;
        .....skipped getter setters
}

public class Class B
{
    public Input input { get; set; }

}
public class Input
{
    public Output output{ get; set; }
}
public class Output
{
    public string Title { get; set; }
    public string Date { get; set; }
    public string id { get; set; }
    public string location { get; set; }
    public string Status { get; set; }
    public string laterDate { get; set; }
    public string hashNumber { get; set; }
    public Info info { get; set; }
}
public class Info
{
    public string name { get; set; }
    public string ht { get; set; }
    public string type { get; set; }
    public string res { get; set; }
    public string wd { get; set; }
    public string ornt { get; set; }
}

Հենց հիմա ես պատճենում եմ objA-ն objB-ում՝ օգտագործելով փոխարկիչի դասը և պատճենում եմ՝ օգտագործելով ստորև բերված կոդի հատվածը

objB.input.output.Title = objA.Title;
objB.input.output.Date = objA.Date;
objB.input.output.id = objA.id;
objB.input.output.location = objA.location;
objB.input.output.Status = objA.Status;
objB.input.output.hashNumber = objA.hashNumber;

objB.input.output.inf.type = objA.ABCHeaderField.outputTypeField

Շնորհակալություն...

c#
22.11.2019

  • եթե գույքի անունները նույնական են երկու դասերից, ապա դա անելու հնարավորություն կա: սրա օգնությամբ՝stackoverflow.com/a/4144817/7124761 հակառակ դեպքում, կարծում եմ, դա հնարավոր չէ: 22.11.2019
  • մի հայացք գցեք automapper-ին: automapper-ը գրադարան է, որը նախատեսված է այս նպատակով: 22.11.2019
  • Ինչպե՞ս են փոխկապակցված երկու դասերը, եթե նրանց անդամները տարբեր են: Գուցե նրանք ունեն ընդհանուր նախահայր կամ որոշ հատկություններ կարող են կոդավորվել ընդհանուր ինտերֆեյսի մեջ: | Եթե ​​ձեր ընթացիկ կոդը աշխատում է, դուք պետք է շարունակեք օգտագործել այն: Միակ այլ ճանապարհը, որը ես կարող եմ մտածել, օգտագործում է Reflection-ը: Արտացոլումը լավ վերադարձ է, բայց երբեք չպետք է օգտագործվի որպես արդյունավետ/առաջնային լուծում: Արտացոլումն այն է, ինչ դուք օգտագործում եք, եթե (դեռևս) չունեք փոխարկիչի կոդ, ինչպես ցույց տվեցիք: 22.11.2019
  • @Christopher, 2 դասերը փոխկապակցված են այնպես, որ. համարենք, որ objA-ն մուտքային օբյեկտ է մի համակարգից, իսկ objB-ն՝ մեկ այլ համակարգ ուղարկելու օբյեկտ: Բայց objB-ին անհրաժեշտ են objA-ի տվյալները 22.11.2019

Պատասխանները:


1

Դուք կարող եք ստեղծել ինտերֆեյս BaseObject բազային դաշտերով, որոնք կարող են իրականացվել A և Output դասերի կողմից.

public interface BaseObject
{
    string Title { get; set; }
    string Date { get; set; }
    string id { get; set; }
    string location { get; set; }
    string Status { get; set; }
    string laterDate { get; set; }
    string hashNumber { get; set; }
    Info info { get; set; }
}
public class A : BaseObject
{
    public string Title { get; set; }
    public string Date { get; set; }
    public string id { get; set; }
    public string location { get; set; }
    public string Status { get; set; }
    public string laterDate { get; set; }
    public string hashNumber { get; set; }
    public Info info { get; set; }
  // your code....
}
public class B
{
    public Input Input { get; set; }
}
public class Input
{
    public BaseObject Output{ get; set; }
}

public class Output : BaseObject
{
    public string Title { get; set; }
    public string Date { get; set; }
    public string id { get; set; }
    public string location { get; set; }
    public string Status { get; set; }
    public string laterDate { get; set; }
    public string hashNumber { get; set; }
    public Info info { get; set; }
}

Եվ հետո դուք կարող եք դա անել.

var objB = new B
{
     Input = new Input
     {
        Output = new A()
      }
};

Եթե ​​օբյեկտը սկզբնավորվել է և սկզբնավորվել է դաշտը Մուտքագրեք.

objB.Input.Output = objA;
22.11.2019

2

Մեկնաբանություններից.

2 դասերը փոխկապակցված են այնպես, որ. համարենք, որ objA-ն մուտքային օբյեկտ է մի համակարգից, իսկ objB-ն՝ մեկ այլ համակարգ ուղարկելու օբյեկտ: Բայց objB-ին անհրաժեշտ են objA-ի տվյալները

Ինչ կասեք դասի «համօգտագործվող տվյալների» մասին: Մի բան, որն ունի բոլոր այն ոլորտները, որոնք երկու կողմերն էլ ընդհանուր էին: Կախված դեպքից, միայն կարդալու կառուցվածքը կարող է ավելի լավ լինել, հակառակ դեպքում դուք կարող եք ստիպված լինել կլոնավորել:

public readonly struct SharedData{
    public readonly string Title;
    public readonly string Date;
    public readonly string id;
    public readonly string location;
    public readonly string Status;
    public readonly string laterDate;
    public readonly string hashNumber;
}

MVVM օրինաչափությունը շատ բան է առնչվում ներկայացման հետ: Իրոք, դրա համար է View Model-ի մեծ մասը, այդ տառերի կեսը: MVVM-ում ձեզ անհրաժեշտ են հատկություններ փոփոխության ծանուցմամբ, հաճախ այնպիսիք, որոնք ընդունում են նաև չմշակված տողերը: Տեսակետը սովորաբար չունի դրանք, և չի կարող փոփոխվել դրանք ստանալու համար:

«Եթե դուք չեք կարող այն փոփոխել, փաթեթավորեք այն ինչ-որ բանի մեջ, որը կարող եք փոփոխել»: View դասերի մեծ մասը չի կարող փոփոխվել կամ ժառանգվել: Որովհետև նրանք գալիս են ինչ-որ արտաքին աղբյուրից, կամ նրանց ներկայիս պահվածքն անհրաժեշտ է: Այսպիսով, դուք սովորաբար պետք է գրեք ViewModel դասեր՝ այդ View դասերի շուրջը փաթաթելու հիմնական նպատակով: (ՎՄ դասեր ստեղծելու այլ առավելություններ կան, բայց դրանք հակված են հատուկ MVVM/XAML-ին):

26.11.2019
Նոր նյութեր

Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..