调用具有类似属性的其他类的C#主类

时间:2017-05-04 17:03:11

标签: c# class

我有很多类存储不同类型的数据,但操作数据的方式不同。有什么事情我可以抽象出我正在使用的课程......并且只是调用课程的方法吗?我将有一个我在特定时刻使用的对象,即masterclass。

例如,我有class1和class2。这两个类都可以做.add .subtract ...等。

我想说... masterclass现在是class1。所以我可以做masterclass.add而不是class1.add。然后将masterclass更改为class2并执行masterclass.subtract而不是class1.subtract。

好的......也许这更清楚:

class cat
{
    String legs="4 legs";
    String claws="cat has lots of claws";
    public string GetLegs()
    { return legs+claws;
    }
}
class bird
{
    String legs="2 wings";
    String talons="Bird has 2 talons";
    public string GetLegs()
    { return legs+talons;
    }
}
class animal;

mainfunction()
{
    string temp;

    animal = cat;
    temp = animal.GetLegs();
    animal = bird;
    temp = animal.getLegs();    
}

1 个答案:

答案 0 :(得分:3)

您可以通过多种方式执行此操作,要么使用接口,要么实现它,例如:

public interface ICalculate {
    void Add();
    void Subtract();
}

以你从接口继承的方式实现你的类,如下所示:

public class SpecificClass : ICalculate {
    public void Add() {
        // ...
    }

    public void Subtract() {
        // ...
    }
}

public class OtherSpecificClass : ICalculate {
    public void Add() {
        // ...
    }

    public void Subtract() {
        // ...
    }
}

或者你可以使用像:

这样的抽象基类
public abstract class AbstractCalculate {
    public abstract void Add();
    public abstract void Subtract();
}

并实现特定的类,如:

public class SpecificCalculate : AbstractCalculate {
    public override void Add() {
        // ...
    }

    public override void Subtract() {
        // ...
    }
}

在第一个示例中,您可以创建特定的类,如:

ICalculate calc1 = new SpecificCalculate();

并致电

calc1.Add();

在第二个中,您可以使用

AbstractCalculate calc11 = new SpecificCalculate();

并致电

calc1.Add();

两者都有类似的工作方式,两者都有其优点

您可以在MSDN

上找到更多信息

根据Ed Plunkett的建议,您可以在后面进行实施(假设为ICalculate版本)

IList<ICalculate> calculations = new List<ICalculate>();

// <-- add specific instances to the list
calculations.Add( new SpecificClass() );
calculations.Add( new OtherSpecificClass() );

// iterate the list
foreach (var calculation in calculations) {
    calculation.Add(); 
}

或更具体地针对您更新的问题

public interface IAnimal {
    int GetLegs();
}

public class Bird : IAnimal {
    public int GetLegs() {
        return 2;
    }
}

public class Cat : IAnimal {
    public int GetLegs() {
        return 4;
    }
}

,程序会像

一样使用它
class Program {
    static int GetLegs(IAnimal animal) {
        return animal.GetLegs();
    }

    static void Main(string[] args) {
        Cat cat = new Cat();
        Bird bird = new Bird();

        Console.WriteLine( GetLegs( bird ) ); // 2
        Console.WriteLine( GetLegs( cat ) ); // 4
    }
}

或者喜欢

IList<IAnimal> animals = new List<IAnimal>();
animals.Add( new Cat() );
animals.Add( new Bird() );

int totalLegs = 0;
foreach (var animal in animals) {
    totalLegs += animal.GetLegs(); // or totalLegs += GetLegs( animal );
}
Console.WriteLine( totalLegs ); // 6