Ristrict方法调用继承类

时间:2017-05-31 08:26:24

标签: c# class

我有2个班级,Child班级继承自Parent班级。

public class Parent
{
    public string item{get;set;}
}

public class Child : Parent
{
}

public static void ConsoleWrite(Parent pitem)
{
    Console.Write(pitem.item);
}

public static void Main()
{
    ConsoleWrite(new Child(){item = "foo"});
}

https://dotnetfiddle.net/yPriNl

只能使用ConsoleWrite对象调用Parent方法,但也可以使用Child对象调用它。有没有办法对此进行评估?

3 个答案:

答案 0 :(得分:1)

我建议您在不同的命名空间和您的Program类中组织您的父级别的子句。将子类定义为私有。这样就无法访问儿童元素,但只有当它们被转移到父母身上时才会访问:

namespace ClassesDemo
{
   public class Parent
   {
       public string item{get;set;}
   }

   private class Child : Parent
   {
   }
}

namespace MainProgram
{
   class Program
   {
      public static void ConsoleWrite(Parent pitem)
      {
          Console.Write(pitem.item);
      }

      public static void Main()
      {
          ConsoleWrite(new Child(){item = "foo"});
      }
   }
}

答案 1 :(得分:1)

总的来说,没有多大意义,如果你不想让孩子可以用在期望他们父母的方法中,你为什么要使用遗产呢?

您可以通过抛出异常来阻止它:

public static void ConsoleWrite(Parent pitem)
{
    if(pitem?.GetType().IsSubclassOf(typeof(Parent)) == true)
    {
        throw new ArgumentException("Only parent type is allowed", nameof(pitem));
    }

    Console.Write(pitem?.item);
}

也许你不想要继承,但两个类都有共同的属性,你可以让它们实现相同的接口:

public interface IItem
{
    string Item { get; set; }
}

public class Type1: IItem
{
    public string Item { get; set; }
}

public class Type2 : IItem
{
    public string Item { get; set; }
}

现在他们不是父母 - 孩子,因此期望Type1的方法无法与Type2的实例一起使用。但是,如果该方法接受IItem,您将遇到同样的问题; - )

答案 2 :(得分:0)

我已经修改了一些代码来限制它,但它没有显示任何编译时错误。引发运行时错误。代码如下:

using System;


public class Program
{
 public class Parent
 {

    public virtual string item{get;set;}
 }

 public class Child : Parent
 {

    public new string item
    {
        get
        {
            throw new NotSupportedException();
        }
        set
        {
            throw new NotSupportedException();
        }
    }

}

public static void ConsoleWrite(Parent pitem)
{
    Console.Write(pitem.item);
}

public static void Main()
{
    ConsoleWrite(new Child(){item = "foo"});
}

}