Chris Padilla/Blog

My passion project! Posts spanning music, art, software, books, and more
You can follow by Newsletter or RSS! (What's RSS?) Full archive here.

    Polymorphism Through Abstract Classes in C#

    One of the 3-7 pillars of Object Oriented Programming (number depending on who you talk to) is Polymorphism.

    What is polymorphism?

    When designing classes, it's sometimes helpful to have parent-children relationships. A "Vehicle" class could have attributes like "Passengers," "Color," and "Speed". It can have methods like "FuelUp", "LoadPassangers", etc.

    Deriving from that, we can then have child classes for Cars and Boats.

    Here's what that would look like in C#:

    namespace ChrisGarage
    {
        public class Vehicle
        {
            private List<string> Passengers = new List<string>();
            public readonly string Color;
    
            public void LoadPassenger(string passenger)
            {
                // . . .
            }
    
            public Vehicle(string color)
            {
                if (String.IsNullOrEmpty(color))
                {
                    throw new ArgumentException("Color String cannot be null");
                }
                Color = color;
            }
    
        }
    
        public class Car : Vehicle
        {
            public Car(string color) : base(color) { }
    
    
        }
    
        public class Boat : Vehicle
        {
            public Boat(string color) : base(color) { }
    
    
        }
    }

    Easy!

    So that's inheritance, but it's not quite polymorphism. Polymorphism is the manipulation of the inherited classes to suit the needs of the children classes.

    Continuing with the vehicle example, it's safe to say that all vehicles move. They'll need a "Move" method.

    But a car does not move in the same way a boat moves!

    We could define those separately on the children. But it's safe to say, if it's a vehicle, we expect it to move. We want the vehicles to conform to that shape.

    Why? Say we're iterating through a list of vehicles and running the move method on them. We want to be sure that there is a move method.

    We can enforce that through the abstract and override keywords.

    // Declaring class as abstract, in other words, incomplete.
        public abstract class Vehicle
        {
            private List<string> Passengers = new List<string>();
            public readonly string Color;
    
            public void LoadPassenger(string passenger)
            {
                // . . .
            }
    
            public Vehicle(string color)
            {
                if (String.IsNullOrEmpty(color))
                {
                    throw new ArgumentException("Color String cannot be null");
                }
                Color = color;
            }
    
            // Adding the move abstract
            public abstract void Move();
    
    
        }
    
        public class Car : Vehicle
        {
            public Car(string color) : base(color) { }
    
            // Writing custom car algorithm
            public override void Move()
            {
                Console.WriteLine("Drive");
            }
        }
    
        public class Boat : Vehicle
        {
            public Boat(string color) : base(color) { }
    
            // Writing custom Boat algorithm
            public override void Move()
            {
                Console.WriteLine("Sail");
            }
        }

    On the parent, we set the class as abstract and include an abstract method to signal that we want this method to be completed by developers designing the derived classes.

    On the children, we use the override keyword and do the work of deciding how each vehicle should move.

    A note on abstract: If you wanted to provide some base implementation, you could use the virtual keyword instead and write out your procedure. Virtual also makes overriding optional.

    You then can decide to call the base class's Move method, the way that we do here for the Draw method:

    public class Rectangle : Shape
    {
        public override void Draw()
        {
            base.Draw();
            Console.WriteLine("Rectangle");
        }
    
    }

    Lessons From a Year of Blogging

    My domain renewed and my blog turned a year old! What started as a fun technical project has turned into a wildly gratifying medium for expression. I'm starting to think it might even become my life's work!

    I've learned a ton in the process of writing a bit each day. The first draft of this has a list of bullet points a mile long. Here are some of the most salient takeaways, and why I'll keep writing:

    Performing on a Stage

    The process truly is the product. The greatest gift of sharing online isn't really so that thousands of strangers can see what you create. It's in the making.

    But there's something to performing on stage that's different than the practice room.

    It's the feeling of elevation and a sense of audience that can really stir the spirit. I write for myself everyday in a journal. But I don't quite reach the same clarity of thought or spiritual sense of communing with the Great Creator.

    Put another way — sure, in school you might doodle on your math homework. But when given a canvas that will be framed on a wall, there's a calling to create something more.

    Maybe that's overstating things here. It's just a blog, after all.

    But the feeling is there. It was the same with music. An audience of 3 is still an audience in a concert hall. Any audience is enough to complete the performance.

    Clarity

    I thought this was just a point for software, but it goes beyond that.

    Writing about code helps clarify thinking around it. That goes for writing what I'm learning, topics reading about, and projects I've built. It even goes for testing.

    Turns out, the same is true for everything else. Writing a post about creativity solidifies my thoughts around it. I've had moments in the studio where I was stuck on something, but remembering "hey, didn't you write a blog post about practicing slow?" actually came up.

    There's the technical side of it, too. Wanting to record a guitar tune for this site makes my practice on it that much more focused. Same for art — having a platform to share pushes me to want to refine my line quality and try new skills.

    Kleon makes a good point that writing helps him figure out what he has to say. The more I write, the more I feel a writing voice coming through. I become aware of what's valuable in what I have to say through — well — saying things.

    Long Term Conversations

    Alan Jacobs mentions that the best part of blogging is revisting themes and topics.

    Everyone who writes a blog for a while knows that one of the best things about it is the way it allows you to revisit themes and topics. You connect one post to another by linking to it; you connect many posts together by tagging. Over time you develop fascinating resonances, and can trace the development of your thought.

    I'm just at the start, but I'll echo that already it's been fascinating holding a long term conversation with myself and other blogs and books.

    It's Surprisingly Expressive

    It's a great answer to the equation of Impression Munis Expression Equals Depression

    You know how there's probably that thing you're really into that's pretty niche (say, vintage radio collecting?) Or maybe the work you do is too technical to be good small talk fodder? Or maybe you just have those sensations, feelings, and impressions that are too nuanced to express in a passing conversation? Yeah, writing is good for that.

    What makes a personal blog interesting is bringing in the full spectrum of what tickles your brain. Somedays it is executing SQL queries through Python, other days it's musings on books, other days it's leaving memories from a fun weekend. Some of my favorite tech blogs have a wild amount of personality shining through them. It's fun to have many pots boiling!

    All creative practices are actually really similar once you get past the details of medium. If you want an outlet but don't feel like you're creative ("I couldn't sing my way out of a paper bag!", "I can only draw stick figures!",) I think you ought to try blogging. You're a Mozart in your own way of speaking and living. Words are a pretty great way to capture your impressions.

    👋

    A year is just the start. Many of the folks I admire are prolific and diverse bloggers. If you've read, commented, emailed, or been a part of it in anyway — Hey! Thanks! Here's hoping for many more years!

    Holding With a Loose Grip

    I have a nasty habit of holding my pencil with a mean pinch. I can't write for too long because my palm will get sore.

    It's something I'm being mindful of now that I'm drawing regularly.

    How it probably happened:

    1. Go to school, learn how to hold a pencil properly
    2. Before I nailed that, I had to learn to write accurately - hitting the tops of my letters on the dotted lines
    3. Strain a bit to get it right, trading good form for accuracy
    4. The bad habit solidifies once accuracy became more important than technique

    It's easy to imagine that in other disciplines, and on a much more serious scale. On sax, I knew folks that developed tendonitis. I've heard of artists with Focal Dystonia. Even when I taught marching band, I saw students push themselves to overexertion.

    So I'm stopping to ask myself: What if it were flipped? What if the way I did things was more important than the end result?

    Here's how it's going so far with drawing: comically!

    My lines were already pretty inaccurate, now they're hilariously so! It's both frustrating and...fun!?

    It's been a weird cheat for another benefit. Focusing more on how I'm holding the pencil has made it so I can let go of the result. In other words, drawing is even more playful than it was before!

    I'm already translating this to guitar and piano to pretty great effect. Things are moving more slowly, but I don't leave either instrument with any cramps. Since the physical process was more pleasurably, lo and behold, I'm feeling even more bouncy and light after leaving a session.

    W.A. Mathieu has a great essay in The Listening Book that advocates for practicing slowly. The message is different: practice slowly to learn quickly. But the sentiment is similar:

    Lentus Celer Est

    This is bogus Latin for Slow (lentus) Is Fast (celery). Write it large somewhere. It means you cannot achieve speed by speedy practice. The only way to get fast is to be deep, wide awake, and slow. When you habitually zip through your music, your ears are crystallizing in sloppiness.

    Yet almost everyone practices too fast, their own music as well as others'. We want to be the person who is brilliant. This desire is compelling, and it can become what our music is about.

    Pray to Saint Lentus for release from zealous celerity. Pray for the patience of a stonecutter. Pray to understand that speed is one of those things you have to give up—like love—before it comes flying to you through the back window.

    Does it have to stop there? There's a big life metaphor here, I bet! Say: setting up your days where you actually enjoy them, have energy to do the most important things, and in a way that sustains relationships.

    I'm going to keep trying: Holding days and practices with a loose grip.

    Childhood Home Sketch

    The google maps car used a REALLY nice camera last time they drove by, wow

    Thinking of my childhood home 🏡

    Beethoven - German Dance

    Listen on Youtube

    🕺

    When I started lessons last year, this was my first assignment. It took aaaaalll week to get to a point where I could make my way through it. Now, I'm able to brush it up and play it through in a couple of sessions. A proud moment!