90 lines
1.6 KiB
Plaintext
90 lines
1.6 KiB
Plaintext
== Why is this an issue?
|
|
|
|
The purpose of an abstract class is to provide some heritable behaviors while also defining methods which must be implemented by sub-classes.
|
|
|
|
|
|
A ``++class++`` with no abstract methods that was made ``++abstract++`` purely to prevent instantiation should be converted to a concrete ``++class++`` (i.e. remove the ``++abstract++`` keyword) with a ``++protected++`` constructor.
|
|
|
|
|
|
A ``++class++`` with only ``++abstract++`` methods and no inheritable behavior should be converted to an ``++interface++``.
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,csharp]
|
|
----
|
|
public abstract class Animal //Noncompliant; should be an interface
|
|
{
|
|
abstract void Move();
|
|
abstract void Feed();
|
|
}
|
|
|
|
public abstract class Color //Noncompliant; should be concrete with a protected constructor
|
|
{
|
|
private int red = 0;
|
|
private int green = 0;
|
|
private int blue = 0;
|
|
|
|
public int GetRed()
|
|
{
|
|
return red;
|
|
}
|
|
}
|
|
----
|
|
|
|
=== Compliant solution
|
|
|
|
[source,csharp]
|
|
----
|
|
public interface Animal
|
|
{
|
|
void Move();
|
|
void Feed();
|
|
}
|
|
|
|
public class Color
|
|
{
|
|
private int red = 0;
|
|
private int green = 0;
|
|
private int blue = 0;
|
|
|
|
protected Color()
|
|
{}
|
|
|
|
public int GetRed()
|
|
{
|
|
return red;
|
|
}
|
|
}
|
|
|
|
public abstract class Lamp
|
|
{
|
|
private bool switchLamp = false;
|
|
|
|
public abstract void Glow();
|
|
|
|
public void FlipSwitch()
|
|
{
|
|
switchLamp = !switchLamp;
|
|
if (switchLamp)
|
|
{
|
|
Glow();
|
|
}
|
|
}
|
|
}
|
|
----
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
include::message.adoc[]
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
include::../comments-and-links.adoc[]
|
|
endif::env-github,rspecator-view[]
|