#770 – Use Intellisense to Get List of Methods to Override

In a derived class, you can override a member of the base class if it’s declared as virtual.  In Visual Studio, the Intellisense feature can help you to discover the methods that can be overridden.

Suppose that we have the following definition for Dog:

    public class Dog
    {
        public virtual string Prop1 { get; set; }
        public string Prop2 { get; set; }

        public virtual void Method1()
        {
            Console.WriteLine("Dog.Method1");
        }

        public void Method2()
        {
            Console.WriteLine("Dog.Method2");
        }
    }

Now when we are adding code to a child class of Dog, we can just enter the keyword override, followed by a space, to see a list of candidate members that can be overridden.

770-001

To add the code for one of these members, just use the down arrow to select the method and then press TAB.  The body of the method will be generated for you.

770-002

#769 – Pattern – Call a Base Class Method When You Override It

You can call a method in a class’ base class using the base keyword. You can do this from anywhere within the child class, but  it’s a common pattern to call the base class method when you override it.  This allows you to extend the behavior of that method.

Here’s an example.

    public class Dog
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Dog(string name, int age)
        {
            Name = name;
            Age = age;
        }

        public virtual void DumpInfo()
        {
            Console.WriteLine(string.Format("Dog {0} is {1} years old", Name, Age));
        }
    }

    public class Terrier : Dog
    {
        public double GrowlFactor { get; set; }

        public Terrier(string name, int age, double growlFactor)
            : base(name, age)
        {
            GrowlFactor = growlFactor;
        }

        public override void DumpInfo()
        {
            base.DumpInfo();

            Console.WriteLine(string.Format("  GrowlFactor is {0}", GrowlFactor));
        }
    }

 

            Terrier t = new Terrier("Jack", 17, 9.9);
            t.DumpInfo();

769-001

#768 – When to Call the Constructor of a Base Class

You can use the base keyword in a constructor, to call the constructor of a class’ base class.  You’d most typically do this to allow the constructor in the base class to initialize the data members that are defined in the base class.  Then the constructor of the derived class can initialize its own data members.

In the example below, the Terrier constructor uses the base keyword to invoke the Dog constructor.  Note that the Dog constructor will be executed first.

    public class Dog
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Dog(string name, int age)
        {
            Console.WriteLine("Dog constructor");
            Name = name;
            Age = age;
        }
    }

    public class Terrier : Dog
    {
        public double GrowlFactor { get; set; }

        public Terrier(string name, int age, double growlFactor)
            : base(name, age)
        {
            Console.WriteLine("Terrier constructor");
            GrowlFactor = growlFactor;
        }
    }

768-001

#767 – A struct Is Implicitly Sealed

Every struct in C#, whether it is user-defined or defined in the .NET Framework, is sealed–meaning that you can’t inherit from it.  A struct is sealed because it is a value type and all value types are sealed.

A struct can implement an interface, so it’s possible to see another type name following a colon, after the name of the struct.

In the example below, we get a compile-time error when we try to define a new struct that inherits from the one defined above.

    public struct PersonName
    {
        public PersonName(string first, string last)
        {
            First = first;
            Last = last;
        }

        public string First;
        public string Last;
    }

    // Error at compile time: Type 'PersonName' in interface list is not an interface
    public struct AngryPersonName : PersonName
    {
        public string AngryNickname;
    }

#766 – Adding an Interface to a Class Diagram

If you add a class to a class diagram and the class implements one or more interfaces, you’ll see the interfaces show up on the class with the standard interface designator (a short line with a circle at the end).

766-001

 

You can also add an element to the class diagram that represents the interface itself.  To do this, just right-click on an interface and select Show Interface.

766-002

 

Once you do this, the interface will be added to the diagram.  You can then expand the basic element to see the members of the interface.

766-003

#765 – Adding Base or Derived Classes to a Class Diagram

You can use the class diagram to follow the inheritance chain for any class currently in the diagram, moving up to the class’ base class or down to the classes that derive from the class.

For example, let’s say that you’ve dragged the ArgumentException class onto a class diagram, from the Class View.

Capture

 

You can add the base class of ArgumentException to the diagram by right-clicking on the class and selecting Show Base Class.

765-002

 

The base class will now be shown on the diagram.

765-003

 

You can also show all derived classes of a particular class by right-clicking on the class and selecting Show Derived Classes.

765-004

 

Using this technique, you can easily browse through the classes in the .NET Framework.

765-005

Ad Free

I’ve turned off ads on 2,000 Things You Should Know about C#.  For a full explanation, click here.

#764 – Expanding All Classes in a Class Diagram

By default, when you add types to a class diagram, they are displayed collapsed, showing only the name of the type and the category (e.g. class, interface).

764-001

You can expand individual types by clicking on the double downward facing arrow.  You’ll then see all the members of the type.

You can use the “+” key on the numeric keypad to expand the currently selected type.  You can also do the following, to quickly expand all types:

  • Select all typeson the diagram by pressing Ctrl+A
  • Expand all types by pressiong the “+” key on the numeric keypad
  • Right-click on the diagram and select Layout Diagram

Selecting Layout Diagram will reorganize all types so that they are layed out in a nice way.  The only problem is that types that are not connected to other types in the diagram will once again be collapsed.  You’ll need to expand and manually lay out these types.

764-002

#763 – Fixing a Class Diagram that Cannot Find Types

If you create a class diagram that contains types found in assemblies that your project references, and then you leave the class diagram open when you close Visual Studio, you may see some errors in the class diagram when you re-open the solution.  The types on the class diagram may all be drawn in red and report “Type cannot be found”.

763-001

 

You can fix this problem by just closing and re-opening the class diagram.  The diagram will re-discover the information for the types.

763-002

 

#762 – Creating a Class Diagram Containing Types in the .NET Framework

You typically create a class diagram in a project for the custom types that you’ve created in that project.  You can also include types on a class diagram that come from assemblies that your project references, including the .NET Framework itself.

To add elements to a class diagram representing types in the .NET Framework, do the following:

Add a new class diagram to the project.  (Right-click on project, select AddNew Item, then select Class Diagram).

762-001

 

Switch from Solution Explorer to Class View and expand Project References until you find a namespace or type that you want to look at.

762-002

 

Left-click and drag the selected namespace onto the class diagram.  All types from that namespace will show up on the class diagram (initially zoomed out).

762-003

You can zoom in and expand types to see more details.

762-004