Vraag Het statische lid van een klasse gebruiken op een afgeleid type?


Met behulp van Resharper 4.1 ben ik deze interessante waarschuwing tegengekomen: "Toegang tot een statisch lid van een type via een afgeleid type". Hier is een codevoorbeeld van waar dit gebeurt:

class A {
    public static void SomethingStatic() {
       //[do that thing you do...]
    }
}

class B : A {
}

class SampleUsage {
    public static void Usage() {
        B.SomethingStatic(); // <-- Resharper warning occurs here
    }
}

Weet iemand welke problemen er zijn (als die er zijn) bij het gebruik van de statische leden van A via B?


72
2018-03-18 21:13


oorsprong


antwoorden:


Een plaats waar het misleidend kan zijn, is wanneer de statische elektriciteit een fabrieksmethode is, b.v. de WebRequest klasse heeft een fabrieksmethode Create waardoor dit type code kan worden geschreven als het wordt benaderd via een afgeleide klasse.

var request = (FtpWebRequest)HttpWebRequest.Create("ftp://ftp.example.com");

Hier request is van het type FtpWebRequest maar het is verwarrend omdat het eruit ziet alsof het gemaakt is van een HttpWebRequest (een zusterklasse), ook al is het Create methode is eigenlijk gedefinieerd op WebRequest (de basisklasse). De volgende code heeft dezelfde betekenis, maar is duidelijker:

var request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com");

Uiteindelijk is er geen groot probleem om toegang te krijgen tot een statische via een afgeleid type, maar code is vaak duidelijker door dit niet te doen.


81
2018-03-18 21:23



B.SomethingStatic() maakt de verklaring dat SomethingStatic is lid van B. Dit is niet waar. SomethingStatic is onmiskenbaar lid van A. Het feit dat het toegankelijk is zonder voorbehoud voor leden van B (alsof het lid was van B) is een kwestie van gemak. Het feit dat het toegankelijk is wanneer gekwalificeerd met een B is, IMO, een vergissing.


29
2018-03-18 22:05



Het is geen waarschuwing, meestal alleen maar een suggestie. Je creëert een afhankelijkheid van iets onnodig.

Stel dat u later besluit dat B A niet hoeft te erven. Als u Resharper's advies opvolgt, hoeft u die regel code niet te wijzigen.


15
2018-03-18 21:17



Ja, ik heb dit ook gezien, ik heb altijd gedacht dat het me alleen maar waarschuwde omdat het niet nodig was. A.SomethingStatic(); zou hetzelfde doen.


2
2018-03-18 21:18