如何在C#中通过接口实现这个抽象类/属性逻辑?

时间:2017-06-26 09:06:55

标签: c# interface properties polymorphism method-overriding

我有一个抽象的类数字,其中包含Abstract properties 我在Derived类Rectangle和中覆盖它们 广场。现在,我想用Interface实现它。但我不能用 构造函数,我既不能声明里面的变量 Interface。那么,如何使用Interface实现这一点,其中数字应该是接口 Square和Rectangle应该是类

abstract class Figures
{
    int Width;
    int _cs;
    public Figures(int Width)
    {
        CS = Width;
    }

    public abstract int getarea
    {
        get;
    }
    public abstract int getperm
    {
        get;
    }
    public abstract int CS
    {
        set;
    }

    public abstract void display();
}

class Square : Figures
{
    int _CsS;
    public Square(int c) : base(c)
    {
    }

    public override int getarea
    {
        get
        {
            return (_CsS * _CsS);
        }
    }
    public override int getperm
    {
        get
        {
            return (2 * _CsS * _CsS);
        }
    }
    public override int CS
    {
        set
        {
            _CsS = value;
        }
    }

    public override void display()
    {
        Console.WriteLine("area={0} and perimeter={1}", getarea, getperm);
    }
}

class Rectangle : Figures
{
    int H;
    int _csr;
    public Rectangle(int H, int W) : base(W)
    {
        this.H = H;
    }

    public override int getarea
    {
        get
        {
            return H * _csr;
        }

    }
    public override int getperm
    {
        get
        {
            return 2 * H * _csr;
        }

    }
    public override int CS
    {
        set
        {
            _csr = value;
        }
    }

    public override void display()
    {
        Console.WriteLine("area={0} and perimeter={1}", getarea, getperm);
    }
}

4 个答案:

答案 0 :(得分:1)

您可以这样做:

interface IFigures
{

    int getarea
    {
        get;
    }
    int getperm
    {
        get;
    }
    int CS
    {
        set;
    }

    void display();
}

Thenk您可以从类中实现此接口,并在类本身内部执行逻辑。因此,不必将属性逻辑放在抽象类中,而是必须在子类中编写它们。

class Square : IFigures
{
    int _CsS;
    public Square(int c) 
    {
         CS = c;
    }

    public int getarea
    {
        get
        {
            return (_CsS * _CsS);
        }
    }
    public int getperm
    {
        get
        {
            return (2 * _CsS * _CsS);
        }
    }
    public int CS
    {
        set
        {
            _CsS = value;
        }
    }

    public void display()
    {
        Console.WriteLine("area={0} and perimeter={1}", getarea, getperm);
    }

    //here you have implemented properties
}

答案 1 :(得分:1)

  

所以如何使用Interface

实现这一点

根据定义,界面不会让你实现任何东西。您只能指定事物。

因此,您必须从接口IFigures中删除ctor和字段,并在每个类中重新实现它们。您可以重复使用abstract class FiguresBase: IFigures的实现,但这并不总是最佳设计。

这一切都取决于你想要界面的原因以及你将如何使用它。

答案 2 :(得分:0)

你的抽象课是一件好事。它允许您重用代码。

如果你想要实现松耦合系统,接口(即合同)也很好。

您可以将抽象类和接口结合使用,以实现代码可重用性和松散耦合的部分。

public interface IFigures
{
  int getarea();
}
public abstract class Figures : IFigures
{
  public abstract int getarea();

  //opportunity for code reuse
  protected int getarea_internal()
  {
    throw new NotimplementedExcpetion();
  }
}

public class Square : Figures
public class Rectangle: Figures

答案 3 :(得分:0)

这是答案 与类图

Class Diagram of the Program

//#3
func turnBasedMatchmakerViewController(_ viewController: GKTurnBasedMatchmakerViewController,
didFind match: GKTurnBasedMatch)
{
    print(match)
    myMatch = match
    match.loadMatchData { (d, e) in

        print(d ?? "No Data:")
        let recievedData: [String: Any] = (NSKeyedUnarchiver.unarchiveObject(with: d!) as? [String : Any])!


        // Check if data contains : "name" .. "value"
        if recievedData["name"] != nil && recievedData["value"] != nil
        {

            let name = recievedData["name"] as! String
            let val = recievedData["value"] as! Int

            print("First Item: \(name)")
            print("Second Item: \(val)")

        }


        print(e ?? "No Error:")

    }


    self.dismiss(animated: true, completion: nil)
    //performSegue(withIdentifier: "GamePlayScene", sender: match)
}