Re: why use the 'sealed' ?



Alan Samet <alansamet@xxxxxxxxx> wrote:
> As a general rule, I avoid sealing my classes. It seems that invariably
> I'll want to add functionality to something at a later date. I'm not
> even sure that I like the idea that methods and classes can be
> nonvirtual.

Personally, I love it. Designing classes to be derived from properly is
a lot of work, and shouldn't be undertaken when it's not necessary. To
be honest, I wish classes were sealed by default.

> And I really don't like the fact that static members are
> always final.

Well, how would you expect polymorphism to work with them, seeing as
you can't invoke a static method on an instance anyway? Which static
method is invoked is a compile-time decision, so it doesn't make sense
for them to be virtual.

> While I'm about to do some complaining about certain .NET things, I'm
> going to introduce it by saying that I believe .NET is a great product
> for something still in its first version. The guys at Microsoft did a
> great job.
>
> I sortof wish you could add functionality to (or replace members of)
> existing classes in C# like you can in languages like Ruby. -- like
> being able to add the Left/Right methods to the string class for the
> scope of an application, or replacing the Substring function with
> something that doesn't throw an exception when the Length parameter
> exceeds past the end of the string.

Sounds dangerous to me - sounds like the kind of thing which could
easily introduce unwanted and possibly insecure behaviour. For
instance, I know that when I use a string I can call any method and it
won't change the contents of the string. If one piece of code could
change the implementation of string, all the rest of my code would have
to take that into account.

> I kicked the air a few times when I noticed how many members of the
> ADO.NET namespaces were sealed -- members like SqlDataAdapter. If it
> were not sealed, and say, the "Fill" method was marked as virtual, you
> could easily write some great diagnostic tools.

But then the situations in which Fill is called for you from other
methods would have to be documented, and would then be set in stone,
etc. Like I said, designing for derivation is time-consuming.

> For instance, say you wanted the ability to view all of the raw
> datasets going to an application. All that would be necessary would be
> to subclass the SqlDataAdapter class, override the Fill method with
> something that would, say, raise an event with your data. Then write a
> simple windows application that spawned a window with a datagrid
> populated with that data every time Fill was called. Have that windows
> application act as a Remoting Server for your application, and set the
> application to be a Remoting Client. When you're done diagnosing,
> simply remove your remoting configuration.

I can see how it's useful in certain situations, but I think the
downsides outweigh the upsides in general. Of course, with a proper AOP
system in place, you could have the above without making Fill itself
virtual.

--
Jon Skeet - <skeet@xxxxxxxxx>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too
.



Relevant Pages

  • Re: why use the sealed ?
    ... I'll want to add functionality to something at a later date. ... I sortof wish you could add functionality to (or replace members of) ... simple windows application that spawned a window with a datagrid ... application to be a Remoting Client. ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Predicting the Future and Kolmogorov Complexity
    ... to the source string), k scales with the string, thus destroying the ... excess of symmetry or a lack of it that strikes you as particularly ... The same thing is true of radio signals. ... What do I mean by levels of functionality? ...
    (talk.origins)
  • Re: basic_string causes crash in _vsnprintf???
    ... and any other output string sets used. ... want or revert back to the old stl. ... >> this functionality so while it was not a standard STL implementation ... > In STLport it's just luck that it "works". ...
    (microsoft.public.vc.stl)
  • Re: A question in the objects size.
    ... > int id; ... > String name; ... then the order in which the base and derived members occur could ... leeway in deciding how to arrange the member variables. ...
    (comp.lang.java.programmer)
  • Re: Get/Set vs Public Variables
    ... string firstname; ... EVER will need any functionality in getters and setters for the two string ... databinding that it can bind only to properties and not to variables. ...
    (microsoft.public.dotnet.languages.csharp)