Сыныптың өз ішінде болуы

Егер менде қоғамдық әдістермен (статикалық емес) сынып бар болсам, алмаймын Менде қолданыстағы қоғамдық-статикалық емес әдістерді қолданатын кейбір әдістерді қосу керек,

қалай дұрыс жолмен жасай аламын?

Қазір мен өзімнің әдістерімде басқа әдістерді қолдану үшін өз классымның данасын құрып жатырмын, бірақ бұл жақсы жол деп ойламаймын.

Мысал:

class aaa
{

  public string a(int i)
  {
    ...
  }
  public string b (int i)
  {
    ...
  }

  public static void x()
  {
    aaa myclass = new aaa();
    string str = myclass.a(5);
  }

}
2
Мен осы сыныптың даналарын жасамай, басқа жерге тікелей кіргім келеді, жай ғана aaa.x жазыңыз
қосылды автор user990635, көзі
Қолданыстағы әдістерді өзгерту мүмкін емес ... себебі тым көп қосылымдар бар және т.б. Барлық жұмыс істейді ... Мен оны жасаудың жақсы жолы бар-жоғын білгім келеді
қосылды автор user990635, көзі
@SamIam бұл тәуелділіктермен үзіліссіз өзгеріс болып табылады, оны өзгертуге болмайды.
қосылды автор Servy, көзі
Сонымен, анықтамаға сәйкес, дананың әдісін түрдің данасынсыз шақыру мүмкін емес. Бұл жай ғана факт. Сондықтан, иә, егер сіз мүлдем өзгерте алмасаңыз, онда дананы жасауыңыз қажет.
қосылды автор Servy, көзі
Неге сіз қосқан жаңа әдіс (статистикалар) статистикалық емес деуге болады? Сондай-ақ, оны жою үшін дананы жасау керек пе? Бұл басқа нысандардың жай-күйі шын мәнінде қолданылмағанын және шын мәнінде ескі әдістердің статикалық болуы керек екенін білдіреді, бірақ жоқ. Егер мемлекет сізге қатысты болса, онда сіз, мысалға, параметр ретінде жібергіңіз келеді.
қосылды автор Servy, көзі
Мен бұл мәселені түсінбеймін. Сіз өзіңіздің классыңызды өзгерте алмайсыз ба? (Өйткені сіз жіберген код сіз - сыныпты өзгерте алатынын білдіреді) әдістерді өзгерте алмайсыз ба, неге оларды өзгерте алмайсыз?
қосылды автор Sam I am, көзі
@Servy Мен оны ештеңе айыптауға тырыспадым, жай ғана басқа контекст үшін балық аулауға тырыстым
қосылды автор Sam I am, көзі

8 жауаптар

Менің ойымша, сіздің дизайныңыз толықтай дұрыс емес, бірақ егер сіздің дизайныңызды өзгерте алмасаңыз, ол бұл шеберді жасай алады. Мен де бұл жұмыс түрі дұрыс емес деп ойлаймын.

public class MyClass
{
    public string MethodA(int i)
    {
        return StaticMethodA(i);
    }

    private static string StaticMethodA(int i)
    {
        return String.Format("i is {0}", i);
    }

    public static void MethodX()
    {
        string str = StaticMethodA(5);
    }
}

Енді сіз жасай аласыз:

MyClass mc = new MyClass();
string str = mc.MethodA(3);

//or

MyClass.MethodX();
3
қосылды

Сіздің даналық әдісіңіз статикалық болғандығын шынымен тілегендей көрінеді; ол бастапқыдан статикалық болуы керек, себебі ол объектінің кез-келген ішкі күйін пайдаланбайды (себебі сіздің жаңа әдісіңіз осы түрдің қандай да бір данасын беріп, қайта бермей немесе қайта пайдалануда). Сіз сынған өзгерістерді статикалық ету үшін ғана жасай алмайсыз, себебі оны статистикалық контекстте пайдаланатын тым көп тәуелділіктер бар.

Егер әдісті статикалық түрде өзгерте алмасаңыз да, сіздің шешіміңіз шын мәнінде жағдайды жасай аласыз. Бұл негізінен статистикалық емес әдіске статикалық «терезе» жасайды.

1
қосылды
Tnx кері байланыс үшін :) Ақыр соңында, мен бәрін статикалық барлық тәуелділіктермен және т.б. өзгерту үшін көп уақыт жұмсадық, өйткені мен бұрынғы шешімімді сақтап қалғым келмеді және басқа шешімдердің ешқайсысы менің жасағанымнан жақсы болмады басында....
қосылды автор user990635, көзі

Екі нұсқа:

Статикалық әдісті жазба:

class Other {
  private aaa _MyClass = new aaa();
  public void x() {
    string str = _MyClass.a(5);
  }
}

Aaa статикалық данасы ретінде хабарлаңыз:

static aaa s_MyClass = new aaa();
public static void x() {
  string str = s_MyClass.a(5);
}
0
қосылды

Статистикалық емес әдіске қоңырау шалу үшін сіз міндетті сыныптың данасына ие боласыз, ол сізді шақырғыңыз келетін даналық әдісі. Сонымен қатар сіз class aaa өзгерте алмайсыз, содан кейін оны тек кеңейтілім әдістері немесе сол сыныптан мұраға алады. Мұнда кеңейтім әдісі үлгісі берілген:

public static class MyExtensions
{
    public static void x(this aaa myClass)
    {
      //use public methods of class you are extending
       string str = myclass.a(5);
    }
}

myClass данасы қалыпты әдісі сияқты x әдісін орындауға болады:

aaa myclass = new aaa();
myClass.x();//you extension 

BTW in C# we use PascalNames for classes and methods.

0
қосылды
@Servy кешіріңіз, сізді алдамады. Ол myClass параметрі ретінде өтпейді. Ол өзінің қоғамдық әдістерін айтуға тырысады. Немесе мұнда бірдеңе жоқ па?
қосылды автор Sergey Berezovskiy, көзі
@Servy ОК, менің ойыңызды көремін. Бірақ, менің ойымша, кеңейту - мұнда ОП қажет
қосылды автор Sergey Berezovskiy, көзі
@Servy неге сіздің мәселеңізді түсіндіру дұрыс?
қосылды автор Sergey Berezovskiy, көзі
@Servy менің пікірім жоғары - 1) ол сыныпты өзгерте алмайды. 2) Ол өзінің қоғамдық әдістерін атайды. Осылайша ол 1) басқа сыныпты немесе кеңейтімді жасау керек 2) сыныбының данасы болуы керек. Бұл мені кеңейтілген кеңестің үлгісін ұзартуға әкеледі. әдістері. Тағы бір нұсқасы мұрагерлік. БТТ статикалық әдіс қажет деген сөз жоқ. Бұл жай ғана іске асырылуда
қосылды автор Sergey Berezovskiy, көзі
@Servy 'Менің мүмкін емес өзгерте алатын қоғамдық әдістермен (статикалық емес) сынып бар.' Ол жазған бұл. Қалай болғанда да, мен ОП-ны шынымен қалайтыны туралы дау айтуға ешқандай себеп жоқ. Егер сіз дұрыс болсаңыз, ол сіздің жауапыңызды дұрыс деп белгілейді
қосылды автор Sergey Berezovskiy, көзі
Мүмкін, ол оны параметр ретінде жіберсе, бірақ ол жоқ. Сондай-ақ, бұл ештеңе өзгермейді, бұл жай ғана елесін дана мүшесінің болуына мүмкіндік береді. Оның шын мәнінде мұқтаж болғаны - даналық әдіс емес, статикалық әдіс емес, статикалық әдіс жасау.
қосылды автор Servy, көзі
Егер сіз сәтте кеңейтілім аспектісін ұмытып қалсаңыз (бұл тек көрінбейтіндіктен, ол не істемейді) сіз aaa түріндегі әдіске жаңа параметр қосуды ұсынамыз. Мен жинай алатынымнан, емес параметрі болып табылатыны әдейі. Ол тілейді емес, біреуін жібереді және ол әдіс дана әдісі сияқты көрінуі керек емес. Бұл мәселені түсіндіруім де бар.
қосылды автор Servy, көзі
Неліктен? Егер мәселені түсіндіру дұрыс болса және оның даналық әдісі болуы керек статикалық әдіс емес, статикалық әдісі бар болса, кеңейтілім әдісі мүлдем көмектеспейді. Ол тек қалаған нәрсеге қайшы келеді. Егер ол жаңа үлгі әдісін қаласа, ол жаңа әдіс қосады. Ол мұны қаламайды.
қосылды автор Servy, көзі
Сіз «өз көзқарасыңды көремін» дейтін болсаңыз, сіз бұл мәселеге келіскеніңізді немесе кем дегенде оның ақылға қонымды болғанын сезінетін боларсыз. Кеңейтім әдісіне мұқтаж деп ойлағаныңыз үшін не ойлайсыз? Егер ол жаңа x әдісін дана әдісі ретінде қаласа, ол кеңейтім әдісімен емес, оны даналық әдісі етеді.
қосылды автор Servy, көзі
Бірақ ол мүмкін сыныпты өзгерте алады. Ол тек қолданыстағы әдістердің қолтаңбасын өзгерте алмайды, себебі бұл оның кодын бұзатын өзгерістер болар еді. Ол қаласа, жаңа әдістерді қоса алады. Оның жасай алмайтыны - a дегенді статикалық ету үшін, ол логикалық тұрғыдан статистикалық болуы керек. Ол a әдісіндегі әрекеттерді a әдісі деп атайтын бар барлық кодты бұзусыз орындаған жаңа статикалық әдісті жасау үшін осы дизайны кемшілігіне қалай қарай алатындығын біледі.
қосылды автор Servy, көзі
Сұрақтың өзі туралы пікірлерді қараңыз. x әдісін қосуға қабілетті болды, сондықтан ол сыныпты өзгерте алады. Бұл сынып өзгерте алмайтын әдіс. Сэм сіздердің сұрақтарыңызға жауап берген кезде, ОС мұны сыныпқа жаңа әдістерді қосуға болатынын түсіндірді, бірақ ол қолданыстағы әдістердің қолтаңбасын өзгерте алмайды, себебі ол осы әдістерді шақыратын бар барлық кодты бұзады.
қосылды автор Servy, көзі

Кеңейтім әдістеріне арналған нақты пайдалану коды imho.

Сіз жабық мінезге мінез-құлық (жаңа әдістер) қосуыңыз керек. Сондықтан жай ғана барыңыз:

class aaa
{
  public string a(int i)
  {
    ...
  }
  public string b (int i)
  {
    ...
  }
}

static class ExtensionContainer
{
  public static void x(this aaa myclass)
  {
    string str = myclass.a(5);
  }
}

Кеңейтім әдісі (лар) даналық әдістер сияқты шақырылатын болады, сондықтан қоңырау шалушы сізге қолдануға қажетті функцияларды қамтамасыз етеді.

Егер сізде жаңа әдіс статикалық болуы талап етілсе, бұл - үлкен кодтық иіс. Статикалық әдістер таза функцияларға жақындады - және іске асыру үшін ішкі мемлекеттік объектіні пайдалану керек пе?

Егер бұл жаман дизайнның белгісі болмаса, мен өзімнің кодыңызды білмеймін, тек өзіңіздің сыныптың (aaa) синглосын жасаңыз және бұл нысанды іске асыру үшін пайдаланыңыз.

0
қосылды

Міне, мұра пайдалы болады. C# ішіндегі синтаксисі:

public class myClass : aaa
{

Содан кейін барлық істеу керек, бұл әдіс осы сыныпта. Басқа әдістер де жұмыс істейді.

0
қосылды
Одан не нәрсе аламын? бәрі бәрібір жұмыс істейді, мен жай ғана «дұрыс» жолды іздеймін
қосылды автор user990635, көзі

If you cannot change the class use extension methods. link

0
қосылды